本页内容

QDesktopServices Class

QDesktopServices 类提供了用于访问常用桌面服务的方法。更多内容...

头文件: #include <QDesktopServices>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

静态公共成员

bool openUrl(const QUrl &url)
void setUrlHandler(const QString &scheme, QObject *receiver, const char *method)
void unsetUrlHandler(const QString &scheme)

详细说明

许多桌面环境都提供了服务,应用程序可以利用这些服务以既一致又兼顾用户应用程序偏好的方式执行常见任务,例如打开网页。

该类包含一些函数,这些函数为这些服务提供了简单的接口,并指示操作是成功还是失败。

openUrl() 函数用于在外部应用程序中打开位于任意 URL 上的文件。对于对应于本地文件系统上资源的 URL(其 URL 方案为“file”),将使用合适的应用程序打开该文件;否则,将使用 Web 浏览器获取并显示该文件。

用户的桌面设置决定了某些可执行文件类型是打开供浏览,还是直接执行。某些桌面环境被配置为禁止用户执行从非本地 URL 获取的文件,或者在执行前先征得用户的许可。

URL 处理程序

openUrl() 函数的行为可以针对各个 URL 方案进行自定义,从而允许应用程序覆盖特定类型 URL 的默认处理行为。

分发机制允许每个 URL 方案仅使用一个自定义处理程序;该设置通过 `setUrlHandler()` 函数完成。每个处理程序都实现为一个槽,该槽仅接受一个 `QUrl ` 参数。

可以通过unsetUrlHandler() 函数移除每个方案的现有处理程序。这将使给定方案的处理行为恢复为默认行为。

例如,该系统使得实现帮助系统变得非常简单。可以在标签和文本浏览器中通过help://myapplication/mytopic URL 提供帮助,而通过注册一个处理程序,就可以在应用程序内部显示帮助文本:

class MyHelpHandler : public QObject
{
    Q_OBJECT
public:
    // ...
public slots:
    void showHelp(const QUrl &url);
};
QDesktopServices::setUrlHandler("help", helpInstance, "showHelp");

如果在处理程序中您判断无法打开请求的 URL,只需再次调用QDesktopServices::openUrl() 并传入相同的参数,它就会尝试使用适合用户桌面环境的机制来打开该 URL。

结合平台特定的设置,通过openUrl() 函数注册的方案还可以向其他应用程序公开,从而为应用程序的深度链接或基于 URL 的基本进程间通信(IPC)机制铺平道路。

另请参阅 QSystemTrayIcon 、QProcess 和QStandardPaths 。

成员函数文档

[static] bool QDesktopServices::openUrl(const QUrl &url)

在用户桌面环境对应的 Web 浏览器中打开指定的url ,如果成功则返回true ;否则返回false 。

如果 URL 指向本地文件(即 URL 方案为“file”),则将使用合适的应用程序而非 Web 浏览器打开该文件。

以下示例将打开 Windows 文件系统中位于包含空格的路径上的文件:

QDesktopServices::openUrl(QUrl("file:///C:/Program Files", QUrl::TolerantMode));

如果指定了mailto 格式的 URL,则将使用用户的电子邮件客户端打开一个包含 URL 中指定选项的撰写窗口,这与 Web 浏览器处理mailto 链接的方式类似。

例如,以下 URL 包含收件人(user@foo.com )、主题(Test )和邮件正文(Just a test ):

mailto:user@foo.com?subject=Test&body=Just a test

警告:尽管许多 电子邮件客户端能够发送附件并支持 Unicode,但 用户可能已将客户端配置为不启用这些功能。此外,某些电子邮件客户端(例如 Lotus Notes)在处理长 URL 时会出现问题。

警告:返回值 true 表示应用程序已成功请求操作系统在外部应用程序中打开该 URL。但外部应用程序仍可能无法启动,或无法打开所请求的 URL。此结果不会反馈给应用程序。

警告: 在 iOS 系统上,传递给此函数的URL 只有在它们的方案被列在应用程序 Info.plist 文件的LSApplicationQueriesSchemes 键中时才会加载。有关更多信息,请参阅 Apple 开发者文档中关于canOpenURL: 的说明。例如,以下几行代码可启用采用 HTTPS 方案的 URL:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>https</string>
</array>

注意:对于 Android Nougat(SDK 24)及更高版本,带有file 方案的 URL 将通过FileProvider打开,该组件会首先尝试获取可共享的content 方案 URI。因此,Qt for Android 定义了一个具有${applicationId}.qtprovider 权限的文件提供程序,其中applicationId 是应用程序的包名,以避免名称冲突。 有关更多信息,请参阅“设置文件共享”。

另请参阅 setUrlHandler()。

[static] void QDesktopServices::setUrlHandler(const QString &scheme, QObject *receiver, const char *method)

将给定的scheme 的处理程序设置为由receiver 对象提供的处理程序method 。

此函数提供了一种自定义openUrl() 行为的方法。如果调用openUrl() 时传入的 URL 包含指定的scheme ,则会调用receiver 对象上的指定method ,而不是由QDesktopServices 启动外部应用程序。

所提供的方法必须作为仅接受单个QUrl 参数的槽来实现。

class MyHelpHandler : public QObject
{
    Q_OBJECT
public:
    // ...
public slots:
    void showHelp(const QUrl &url);
};

如果使用 setUrlHandler() 为已有处理程序的方案设置新的处理程序,则现有处理程序将被新处理程序直接替换。由于QDesktopServices 不持有处理程序的所有权,因此在替换处理程序时不会删除任何对象。

请注意,处理程序始终会在调用 `QDesktopServices::openUrl()` 的同一线程内被调用。

在销毁处理程序对象之前,必须先调用unsetUrlHandler(),以确保处理程序对象的销毁不会与正在使用该对象的openUrl() 的并发调用发生冲突。

iOS 和 macOS

若要在 iOS/macOS 上使用此函数接收来自其他应用的数据,您还需要将自定义方案添加到 Info.plist 文件中的CFBundleURLSchemes 列表中:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myapp</string>
        </array>
    </dict>
</array>

有关详细信息,请参阅 Apple 开发者文档中的《为您的应用定义自定义 URL 方案》。

警告:无法 声明支持某些常见的 URL 方案,包括 http 和 https。此功能仅适用于通用链接。

若要声明支持 http 和 https,则不允许在 Info.plist 文件中添加上述条目。只有将您的域名添加到 Entitlements 文件中时,才允许这样做:

<key>com.apple.developer.associated-domains</key>
<array>
    <string>applinks:your.domain.com</string>
</array>

当应用程序安装时,iOS/macOS 会搜索您域名下的 /.well-known/apple-app-site-association 文件。如果您希望监听https://your.domain.com/help?topic=ABCDEF ,则需要在此处提供以下内容:

{
    "applinks": {
        "apps": [],
        "details": [{
            "appIDs" : [ "ABCDE12345.com.example.app" ],
            "components": [{
                "/": "/help",
                "?": { "topic": "?*"}
            }]
        }]
    }
}

有关更多信息,请参阅 Apple 开发者文档中关于“支持关联域名”的部分。

Android

要在 Android 上使用此功能接收来自其他应用的数据,您需要在应用清单中的 `activity ` 中添加一个或多个 intent 过滤器:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="your.domain.com" android:port="1337" android:path="/help"/>
</intent-filter>

有关更多信息,请参阅《Android 开发者文档》中的“创建应用内容的深度链接”。

若要在 Android 应用中立即打开相应内容(无需用户选择应用),则需要验证您的链接。要启用验证,请在 intent 过滤器中添加一个额外参数:

<intent-filter android:autoVerify="true">

当应用安装时,Android 会查找 `https://your.domain.com/.well-known/assetlinks.json`。若要监听 `https://your.domain.com:1337/help`,您需要在此处提供以下内容:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

有关更多信息,请参阅《Android 开发者文档》中的“验证 Android 应用链接”部分。

另请参阅 openUrl() 和unsetUrlHandler()。

[static] void QDesktopServices::unsetUrlHandler(const QString &scheme)

移除为指定的scheme 此前设置的URL处理程序。

请在为scheme 注册的处理程序对象被销毁之前调用此函数,以防止并发调用的openUrl()继续调用已被销毁的处理程序对象。

另请参阅 setUrlHandler()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.