简述

QDesktopServices类提供的函数用于访问常见的桌面服务。

许多桌面环境都会提供一系列服务,可以通过应用程序来执行常见任务,如:以用户应用程序首选项的方式,打开一个网页。

此类包含为服务提供简单接口的函数,返回值表明执行成功或失败。

openUrl()函数用于打开位于任意外部应用程序的URL文件。如果URL对应于本地文件系统的资源(URL scheme是”file”),将会用一个合适的应用程序打开文件,否则,将使用一个Web浏览器来获取和显示该文件。

URL Handlers

openUrl()函数的行为可以定制,对于某些类型的URL,允许应用程序覆盖默认的处理行为。

调度机制只允许每个URL scheme使用一个自定义handler,使用setUrlHandler()函数。每个handler为一个槽,只接受一个QUrl参数。

对于每个scheme,现有handler可以用unsetUrlHandler()函数移除,这将返回给定scheme的默认行为处理方式。

这个系统很容易实现帮助系统。例如:帮助可以提供标签和文本浏览器使用URL:help://myapplication/mytopic,并通过注册一个handler就可以显示应用程序内的帮助文本。

  1. class MyHelpHandler : public QObject
  2. {
  3. Q_OBJECT
  4. public:
  5. ...
  6. public slots:
  7. void showHelp(const QUrl &url);
  8. };
  9. QDesktopServices::setUrlHandler("help", helpInstance, "showHelp");

在handler中,如果你认为不能打开请求的URL,可以调用QDesktopServices:openUrl(),它将试图使用合适的用户桌面环境打开URL。

注意:Qt5以后,storageLocation()和displayName() 已经由QStandardPaths类的功能取代。

静态共有成员函数

  • bool openUrl(const QUrl & url)

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

例如,用默认浏览器(例如:Chrome)打开一个网址:

  1. QDesktopServices::openUrl(QUrl("http://blog.csdn.net/liang19890820"));

如果URL是本地文件(即:URL scheme是”file”),将会用一个合适的应用程序打开,而不是Web浏览器。

例如,打开一个Windows下包含空格的文件夹:

  1. QDesktopServices::openUrl(QUrl("file:///D:/Program Files/Youdao"));

如果指定一个mailto地址,将会打开e-mail客户端(例如:Outlook),类似于由一个Web浏览器mailto到一个地址。

例如,下面的URL包含收件人(user@qt.com)、主题(Qt)和正文(I am a Qter):

  1. QString strUrl = QString("mailto:%1?subject=%2&body=%3").arg("user@qt.com").arg("Qt").arg("I am a Qter");
  2. QDesktopServices::openUrl(QUrl(strUrl));

警告:

  1. 尽管许多e-mail客户端可以发送附件,并且是能够处理unicode,用户可能已经配置了客户端没有这些功能。同时,某些e-mail客户端(例如:Lotus Notes)使用长URLs可能会有问题。

  2. 真正的返回值表示应用程序已成功请求操作系统用外部应用程序打开请求的URL,但外部应用程序可能仍无法启动或无法打开请求的URL,这将不会报告给应用程序。


  • void setUrlHandler(const QString & scheme, QObject * receiver, const char * method)

为给定的scheme设置handler,receiver是接受者,method为receiver提供的处理函数。

这个函数提供了一种方法来定制openUrl()行为。如果以指定的scheme调用openUrl()(带参数URL),接受者指定的函数将被调用来代替QDesktopServices启动外部应用程序。

接受者提供的函数必须是一个槽,只有接受一个QUrl参数。

如果setUrlHandler()用于为已经拥有handler的scheme设置一个新的handler,现有的handler将被新的替换。由于QDesktopServices并不需要处理handler的所有权,当handler被替换时不删除对象。

注意:handler将总是被执行QDesktopServices::openUrl()的相同线程调用。

例如,检测到scheme为http或file时,不用默认的应用程序打开,直接弹出一个提示框:

  1. QDesktopServices::setUrlHandler("http", this, "openUrl");
  2. QDesktopServices::setUrlHandler("file", this, "openUrl");
  3. QDesktopServices::openUrl(QUrl("http://blog.csdn.net/liang19890820"));
  4. QDesktopServices::openUrl(QUrl("file:///D:/Program Files/Youdao"));
  5. bool MainWindow::openUrl(const QUrl &url)
  6. {
  7. QString strScheme = url.scheme();
  8. if (QString::compare(strScheme, "http", Qt::CaseInsensitive) == 0)
  9. {
  10. QMessageBox::information(this, QString::fromLocal8Bit("提示"), QStringLiteral("打开的是一个网址:%1").arg(url.url()));
  11. return true;
  12. }
  13. else if(QString::compare(strScheme, "file", Qt::CaseInsensitive) == 0)
  14. {
  15. QMessageBox::information(this, QString::fromLocal8Bit("提示"), QStringLiteral("打开的是一个文件:%1").arg(url.url()));
  16. return true;
  17. }
  18. return false;
  19. }

很多人看了好多遍还不会这个用法,不明觉厉,赶快去试试吧!


  • void unsetUrlHandler(const QString & scheme)

删除指定scheme预先设定的URL handler。

例如,对于上面定制的handler,现在不需要了:

  1. QDesktopServices::unsetUrlHandler("http");

Qt之QDesktopServices的更多相关文章

  1. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  2. 使用tencent协议发起临时会话

    调用默认浏览器打开链接tencent://message/?uin=QQ即可发起临时会话参数uin为目标QQ Java示例 import java.awt.Desktop; import java.n ...

  3. 转载:Qt之界面实现技巧

    总结一下,在开发Qt的过程中的一些技巧!可遇而不可求... 一.主界面 1.窗口 最小化 最大化 关闭按钮.显示状态自定义 setWindowFlags(Qt::CustomizeWindowHint ...

  4. Qt Load and Save Image Dialog 加载图片对话框

    在Qt中,我们想要通过对话框来打开某一个图片,可以通过使用QFileDialog来快速实现,参见以下代码: QString fileName = QFileDialog::getOpenFileNam ...

  5. Qt之界面实现技巧

    一.主界面 1.窗口 最小化 最小化 关闭按钮 显示状态自定义 setWindowFlags(Qt::CustomireWindowHint); setWindowFlags(Qt::WindowCl ...

  6. Qt webkit插件相关知识

    1.在Qt中使用 WebKit 浏览器核心 使用 QtWebKit 需要在工程文件(*.pro)中加入: 1.           QT +=webkit   2.           QT += n ...

  7. QDialog, QFileDialog 和 QDesktopServices 的使用方法

    Qt中的QDialog类是用来生成对话框的类,QFileDialog 类是QDialog的衍生类,主要用来生成打开文件,或是打开文件目录的对话框,或者是保存文件的对话框,下面我们一一来看代码: 1. ...

  8. Qt之QLabel

    简述 QLabel提供了一个文本或图像的显示,没有提供用户交互功能. 一个QLabel可以包含以下任意内容类型: 内容 设置 纯文本 使用setText()设置一个QString 富文本 使用setT ...

  9. QT获得所有系统环境变量(包括Linux和MAC的信息)

    系统环境变量还是挺重要的,除了QStandardPaths(感觉都是文档类型的变量,QT4使用QDesktopServices),更有QProcessEnvironment(都是真正的系统变量): Q ...

随机推荐

  1. WinCE C#程序,控制启动时仅仅能启动一个程序,使用相互排斥量来实现,该实现方法測试通过

    </pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_46349 ...

  2. Go语言核心之美 1.1-命名篇

    命名篇 1.Go的函数.变量.常量.自己定义类型.包(Package)的命名方式遵循以下规则: 1)首字符能够是随意的Unicode字符或者下划线 2)剩余字符能够是Unicode字符.下划线.数字 ...

  3. JAVA设计模式之【外观模式】

    通过引入一个外观角色来简化客户端与子系统之间的交互. 顾客无需直接和茶叶.茶具.开水等交互,整个泡茶过程由服务员来完成,顾客只需与服务员交互即可. 通过引入一个外观角色可以降低原有系统的复杂度,同时降 ...

  4. 高斯滤波及高斯卷积核C++实现

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,在图像处理的降噪.平滑中应用较多,特别是对抑制或消除服从正态分布的噪声非常有效. 高斯滤波的过程其实就是对整幅图像进行加权平均操作的过程.滤波后图像上每 ...

  5. pgsql数据库备份还原记

    今天又搞了一个pgsql 的备份还原,差一点没有成功,以前总是想当然的用,没认真想背后的东西,也没对过程中的疑问做记录,所以后面也没什么印象,常见常新,这次既然又遇到就总结一下. 之前操作pgsql数 ...

  6. 网线直连Window和Ubuntu

      找根网线直接连接两台电脑. 然后设置对应的网络到相同的网关和Mask下面.  检测能否ping通就可以直连了.   Ubuntu设置网络后可在IP设置界面里设置Route, 选择直连网线仅用于连接 ...

  7. javax.validation注解使用

    @Pattern(regexp = "^[0-9]*$",message = "完成比例(进度)必须是数字")

  8. AndroidStudio EventBus报错解决方法its super classes have no public methods with the @Subscribe

    首先说明,以前我用eventBus的jar包写得项目demo,前几天就写了一个EventBus的实例,这次我没用jar包,直接用gradle引用的,可是demo写完了,报错: its super cl ...

  9. Linux下查看mysql错误日志

    1.进入 mysql 安装目录 进入 data 目录(该目录存储的是数据库的数据) cd  /usr/local/mysql ll 进入 mysql 目录 ,发现 文件后缀 .err,即是mysql ...

  10. lftp简单使用

    连接服务器: lftp -e "参数;" "username":"password"@"ip" -p port lftp ...