QDesktopServices Class
QDesktopServices 类提供了访问常用桌面服务的方法。更多
Header: | #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"),将使用合适的应用程序打开文件;否则,将使用网络浏览器获取并显示文件。
用户的桌面设置可控制某些可执行文件类型是打开浏览,还是执行。某些桌面环境的配置会阻止用户执行从非本地 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)
在适合用户桌面环境的网络浏览器中打开给定的url ,如果成功则返回true
,否则返回false
。
如果 URL 是对本地文件的引用(即 URL 方案为 "文件"),则将使用合适的应用程序而不是网络浏览器打开该文件。
下面的示例将打开 Windows 文件系统中包含空格的路径上的一个文件:
QDesktopServices::openUrl(QUrl("file:///C:/Program Files", QUrl::TolerantMode));
如果指定了mailto
URL,用户的电子邮件客户端将被用来打开一个包含 URL 中指定选项的作曲家窗口,类似于网络浏览器处理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。此结果不会反馈给应用程序。
警告: 除非应用程序 Info.plist 文件的LSApplicationQueriesSchemes
关键字中列出了 URL 方案,否则 iOS 上传递给此函数的 URL 将无法加载。有关详细信息,请参阅canOpenURL: 的 Apple 开发者文档。例如,以下几行启用了 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() 行为的方法。如果使用带有指定scheme 的 URL 调用openUrl() ,则会调用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 DeveloperDocumentation for Defining a Custom URL Scheme for Your App。
警告: 无法声称支持某些众所周知的 URL 方案,包括 http 和 https。这仅适用于通用链接。
要声称支持 http 和 https,Info.plist 文件中的上述条目是不允许的。只有将域名添加到 "权限 "文件中时,才可以这样做:
<key>com.apple.developer.associated-domains</key> <array> <string>applinks:your.domain.com</string> </array>
安装应用程序时,iOS/macOS 会在你的域上搜索 /.owned/apple-app-site-association。如果要收听https://your.domain.com/help?topic=ABCDEF
,需要在其中提供以下内容:
{ "applinks": { "apps": [], "details": [{ "appIDs" : [ "ABCDE12345.com.example.app" ], "components": [{ "/": "/help", "?": { "topic": "?*"} }] }] } }
有关详细信息,请参阅 Apple Developer Documentation forSupporting Associated Domains。
安卓
要使用此功能从 Android 上的其他应用程序接收数据,需要在应用程序清单的activity
中添加一个或多个意图过滤器:
<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 Developer Documentation forCreate Deep Links to App Content。
要立即打开 Android 应用中的相应内容,而不需要用户选择应用,您需要验证您的链接。要启用验证,请在意图过滤器中添加一个附加参数:
<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 Developer Documentation forVerify Android App Links。
另请参阅 openUrl() 和unsetUrlHandler()。
[static]
void QDesktopServices::unsetUrlHandler(const QString &scheme)
删除先前为指定scheme 设置的 URL 处理程序。
在为scheme 注册的处理程序对象销毁前调用此函数,以防止并发的openUrl() 调用继续调用已销毁的处理程序对象。
另请参阅 setUrlHandler()。
© 2025 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.