Qt使用QDesktopServices::openUrl打开系统默认应用(如浏览器,文件,文件夹和邮件)

简介

QDesktopServices::openUrl 是 Qt 提供的跨平台工具函数,核心作用是调用操作系统的默认应用程序来打开指定的资源(URL / 本地文件 / 协议链接等),无需开发者手动适配不同系统的应用调用逻辑,简化了跨平台开发中的资源打开场景。

支持的资源类型

网络资源:网页 URL(http/https 协议)

本地资源:本地文件、文件夹(通过本地文件路径转换)

系统协议:邮件(mailto 协议)、FTP 链接、本地应用唤起协议等

跨平台支持:兼容 Windows、macOS、Linux 等主流操作系统

1、打开浏览器并输入网址

cpp 复制代码
    ///打开浏览器
    QUrl webUrl = QUrl("http://baidu.com");
    QDesktopServices::openUrl(webUrl);


2、打开邮件

cpp 复制代码
    ///打开邮件客户端
    // 封装 mailto 协议:指定收件人、主题、正文(参数用 URL 编码,中文需转义)
    QString mailUrlStr = "mailto:test@example.com?subject=Qt 咨询&body=您好,我想了解 QDesktopServices 的使用";
    QUrl mailUrl = QUrl(mailUrlStr);
    QDesktopServices::openUrl(mailUrl);


3、打开文件(如图片)

cpp 复制代码
    ///打开本地文件(如 txt文档、图片、PDF、json等)
    //注意点:本地路径不能直接传入 QUrl 构造函数,必须使用 QUrl::fromLocalFile() 进行转换(否则会被解析为网络 URL,导致打开失败)。
    QUrl fileUrl = QUrl::fromLocalFile("/home/forlinx/Pictures/Screenshot from 2025-12-31 17-01-10.png");
    QDesktopServices::openUrl(fileUrl);


4、打开文件夹

cpp 复制代码
 ///打开文件夹
 QUrl dirUrl = QUrl::fromLocalFile("/home/forlinx/Pictures");
 QDesktopServices::openUrl(dirUrl);

扩展:QFileDialog对话框

使用QFileDialog打开选择文件对话框

使用 QFileDialog::getOpenFileName() 弹出 "打开文件" 对话框,用户选择单个文件后返回文件绝对路径,若用户取消选择则返回空字符串。

使用 QFileDialog::getOpenFileNames() 弹出对话框,支持用户按住 Ctrl/Shift 选择多个文件,返回文件路径列表(QStringList),若取消选择则返回空列表。

cpp 复制代码
  // 父窗口(可传nullptr)、对话框标题、默认打开路径(留空则使用系统默认路径)、文件类型过滤器
    QString filePath = QFileDialog::getOpenFileName(
        nullptr,                                    // 父窗口,nullptr表示无父窗口
        "选择要打开的文本文件",                     // 对话框标题
        "",                                         // 默认路径(空字符串=系统默认路径)
        "文本文件 (*.txt);;PDF 文件 (*.pdf);;所有文件 (*.*)"  // 文件过滤器(多个类型用;;分隔)
    );

getOpenFileNames和getOpenFileNames区别,getOpenFileNames支持多选。
使用QFileDialog,弹出文件夹选择对话框,返回选中文件夹的绝对路径,用于仅需选择目录(无需选择具体文件)的场景。

cpp 复制代码
 QString dirPath = QFileDialog::getExistingDirectory(
        nullptr,
        "选择目标文件夹",
        "",  // 默认路径
        QFileDialog::ShowDirsOnly  // 仅显示文件夹(可选参数,默认即为该值)
    );

使用QFileDialog,弹出 "保存文件" 对话框,用户指定保存路径和文件名,若文件已存在,对话框会自动弹出提示框询问是否覆盖。

cpp 复制代码
 QString savePath = QFileDialog::getSaveFileName(
        nullptr,
        "保存文本文件",
        "",
        "文本文件 (*.txt);;所有文件 (*.*)"
    );
相关推荐
未来之窗软件服务1 分钟前
计算机二级[英文]-C 逻辑运算和fopen—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
Jackson_GJH4 分钟前
日志_图解spdlog
开发语言·c++
CodeStats32 分钟前
【Java类加载器】Java 类加载器完整体系深度拆解(下):自定义加载器实战与 SPI 破坏双亲委派(MySQL 驱动揭秘)
java·开发语言·jvm·classloader·双亲委派
砚底藏山河43 分钟前
并发与限频工程:把20只的2秒压到0.5秒不封号(魔码量化实战 #03)
java·开发语言·数据库·python·金融
云雀衔光1 小时前
MCP 协议全景:为什么它是 AI 连接工具的「USB-C」
java·开发语言·数据库·人工智能·ai编程
geovindu1 小时前
go: Task Scheduler
开发语言·后端·golang
会飞的拖把1 小时前
Python 多任务编程:并发、进程、线程与线程安全详解
开发语言·python
君顾12 小时前
折扣卡 CPS 小程序定制:从业务流程到系统架构的实践指南
java·开发语言·折扣卡
老赵的博客2 小时前
c++ 之观察者模式
c++·qt
坚定学代码2 小时前
static在c++中的使用
开发语言·c++