class QDesktopServices#

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

自版本 4.2 开始。

概述#

静态函数#

注意事项

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

详细描述#

警告

本节包含从C++自动转换为Python的代码片段,可能包含错误。

许多桌面环境提供了应用程序可以用来执行常规任务的服务,例如在保持一致的同时考虑用户的程序偏好方式打开网页。

该类包含用于访问这些服务的函数,它们提供简单的接口来指示操作是否成功或失败。

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

用户的桌面设置控制是否打开某些可执行文件类型进行浏览,或者是否执行它们。某些桌面环境配置为防止用户执行从非本地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)#
参数:

urlQUrl

返回类型:

布尔型

警告

本节包含从C++自动转换为Python的代码片段,可能包含错误。

在用户桌面环境的适当浏览器中打开给定的url,如果成功则返回true;否则返回false

如果URL是指向本地文件的引用(即,URL方案是“file”),则它将使用适当的应用程序打开,而不是Web浏览器。

以下示例在包含空格的路径上打开Windows文件系统中的一个文件:

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

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

例如,以下URL包含一个收件人([email protected])、一个主题(Test)和一个消息正文(Just a test

mailto:[email protected]?subject=Testbody=Just a test

警告

尽管许多电子邮件客户端可以发送附件且支持Unicode,但用户可能已经配置其客户端而没有这些特性。此外,某些电子邮件客户端(例如,Lotus Notes)可能会遇到长URL的问题。

警告

返回值 true 表示应用程序已成功请求操作系统在外部应用程序中打开 URL。外部应用程序可能仍然无法启动或无法打开请求的 URL。此结果将不会报告给应用程序。

警告

传递给此函数的 iOS 上的 URL 除非它们的方案列在应用程序的 Info.plist 文件中的 LSApplicationQueriesSchemes 键中,否则不会加载。有关更多信息,请参阅 canOpenURL: 的 Apple 开发者文档。例如,以下行启用了具有 HTTPS 方案的 URL

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

注意事项

对于 Android Nougat (SDK 24) 及以上版本,使用 FileProvider 来打开具有 file 方案的 URL,它首先尝试获取可共享的 content 方案 URI。因此,Qt for Android 定义了一个具有权威 ${applicationId}.qtprovider 的文件提供器,其中 applicationId 是应用程序的包名,以避免名称冲突。有关更多信息,请参阅设置文件共享

另请参见

setUrlHandler()

static setUrlHandler(scheme, receiver, method)#
参数:
  • – str

  • receiverQObject

  • method – str

警告

本节包含从C++自动转换为Python的代码片段,可能包含错误。

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

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

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

class MyHelpHandler(QObject):

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

如果使用 setUrlHandler() 设置已有处理器的方案的新处理器,则现有处理器将被简单地替换为新处理器。由于 QDesktopServices 不拥有处理器,在替换处理器时不会删除任何对象。

请注意,处理器将从调用 openUrl() 的同一线程中调用。

在被销毁处理对象之前,必须调用 unsetUrlHandler(),以避免处理对象的销毁与使用它的 openUrl() 竞态调用重叠。

iOS#

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

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

有关更多信息,请参阅Apple开发者为定义应用的Custom URL Scheme提供的开发者文档。

警告

不可以声明支持某些知名URL方案,包括http和https。这仅适用于Universal Links。

要声明支持http和https,Info.plist文件中的上述条目不允许。这只能在将你的域名添加到Entitlements文件中时才可能。

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

当应用被安装时,iOS将在你的域上搜索/.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开发者为支持Associated Domains提供的开发者文档。

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应用链接提供的开发者文档。

static unsetUrlHandler(scheme)#
参数:

– str

为指定的scheme删除已设置的URL处理程序。

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

另请参见

setUrlHandler()