PySide6.QtGui.QDesktopServices

class QDesktopServices

QDesktopServices 类提供了访问常见桌面服务的方法。更多

在版本4.2中添加。

概要

静态函数

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

许多桌面环境提供了一些服务,这些服务可以被应用程序用来执行常见任务,例如以一致且考虑用户应用程序偏好的方式打开网页。

该类包含提供简单接口的函数,这些接口指示服务是否成功或失败。

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

用户的桌面设置控制某些可执行文件类型是用于浏览还是直接执行。一些桌面环境配置为防止用户执行从非本地URL获取的文件,或在执行前询问用户的许可。

URL 处理器

openUrl() 函数的行为可以为单个URL方案进行自定义,以允许应用程序覆盖某些类型URL的默认处理行为。

调度机制允许每个URL方案仅使用一个自定义处理程序;这是通过setUrlHandler()函数设置的。每个处理程序都实现为一个槽,该槽仅接受单个QUrl参数。

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

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

class MyHelpHandler(QObject):

    Q_OBJECT
# public
    # ...
# public slots
    def showHelp(url):
QDesktopServices.setUrlHandler("help", helpInstance, "showHelp")

如果在处理程序中你决定无法打开请求的URL,你可以再次调用openUrl()并使用相同的参数,它将尝试使用用户桌面环境的适当机制打开URL。

结合平台特定设置,由openUrl()函数注册的方案也可以暴露给其他应用程序,从而为应用程序深度链接或基于URL的非常基本的IPC机制打开大门。

另请参阅

QSystemTrayIconQProcessQStandardPaths

static openUrl(url)
Parameters:

urlQUrl

Return type:

布尔

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

在用户桌面环境的适当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=Testbody=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 setUrlHandler(scheme, receiver, method)
Parameters:
  • scheme – str

  • receiverQObject

  • method – str

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

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

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

提供的方法必须实现为一个只接受单个QUrl参数的槽。

class MyHelpHandler(QObject):

    Q_OBJECT
# public
    # ...
# public slots
    def showHelp(url):

如果使用setUrlHandler()为已经存在处理程序的方案设置新的处理程序,现有的处理程序将简单地被新的处理程序替换。由于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上使用此函数从其他应用程序接收数据,您需要在应用程序清单中的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开发者文档中的创建应用内容深度链接。

要在您的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应用链接的Android开发者文档。

static unsetUrlHandler(scheme)
Parameters:

scheme – str

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

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

另请参阅

setUrlHandler()