QDesktopServices简介(QT打开网页或者资源管理器)

235 篇文章 175 订阅

目录

1.理论介绍

2.打开资源管理器

3.打开网页

4.自定义QDesktopServices::openUrl的行为


1.理论介绍

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

许多桌面环境提供的服务可被应用程序用于执行常见任务,如打开网页,其方式既一致又考虑到用户的应用程序偏好。

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

函数的作用是:打开外部应用程序中位于任意url的文件。对于与本地文件系统上的资源对应的URL (URL方案为“file”),将使用一个合适的应用程序来打开文件;否则,将使用web浏览器来获取和显示文件。

用户的桌面设置控制是否打开某些可执行文件类型进行浏览,或者是否执行它们。一些桌面环境被配置为禁止用户执行从非本地url获取的文件,或者在执行文件之前要求用户的许可。

URL处理程序

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

分派机制只允许对每个URL方案使用一个自定义处理程序;这是使用setUrlHandler()函数设置的。每个处理程序都实现为一个槽,它只接受一个QUrl参数。

可以使用unsetUrlHandler()函数删除每个方案的现有处理程序。这将给定模式的处理行为返回为默认行为。

这理论描述可能比较抽象,本文第4节有实例,请结合起来看。

2.打开资源管理器

#include "QDesktopServices"
#include "QUrl"

//在资源管理器中打开某个文件夹
QDesktopServices::openUrl(QUrl("file:///C:/Program Files", QUrl::TolerantMode));

运行结果

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

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

如果URL是对本地文件的引用(即,URL链接是"file"开头),那么它将用合适的应用程序而不是Web浏览器打开。

上图中代码调用了1个QUrl的构造函数,其第2个参数可选值如下:

ConstantValueDescription
QUrl::TolerantMode0QUrl将试图纠正一些常见的错误的url。这种模式对于解析来自不完全符合标准的源的url非常有用。
QUrl::StrictMode1只接受有效的url。这种模式对于一般的URL验证很有用。
QUrl::DecodedMode2QUrl将以完全解码的形式解释URL组件,其中百分比字符代表它们自己,而不是百分比编码序列的开始。此模式仅对URLsetter设置组件有效;QUrl构造函数、infromEncoded()setUrl()中是不允许的。有关此模式的更多信息,请参阅文档中的QUrl::FullyDecoded

3.打开网页

#include "QDesktopServices"
#include "QUrl"

//调用默认浏览器打开一个网页链接
QDesktopServices::openUrl(QUrl("https://www.baidu.com/", QUrl::TolerantMode));

4.自定义QDesktopServices::openUrl的行为

#include "QMessageBox"
#include "QUrl"

class MyHelpHandler : public QObject
{
	Q_OBJECT
public:

	public slots:
		void showHelp(const QUrl &url)
		{
			QMessageBox mgsBox;
			mgsBox.setText(url.toString());
			mgsBox.exec();
		}
};
#include "desktopservicestest.h"
#include <QtWidgets/QApplication>
#include "QDesktopServices"
#include "MyHelpHandler.h"

MyHelpHandler handler;

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);

	QDesktopServices::setUrlHandler("help", &handler, "showHelp");
	QDesktopServices::openUrl(QUrl("help://showthisword/", QUrl::TolerantMode));

	return a.exec();
}

运行结果

上面代码中我们定义了一个MyHelpHandler类和showHelp函数,这里的类名和函数名可以随便取,但是有如下两点要注意:

  • 新创建的类要是QObject的子类
  • 新创建的函数的参数必须是const QUrl &url

代码的运行原理如下:

使用QDesktopServices::setUrlHandler指定调用QDesktopServices::openUrl时,程序将跳转到哪个函数去执行。上面的实例代码中,指定了当程序调用QDesktopServices::openUrl时,会在openUrl内部调用MyHelpHandler::showHelp。

解释了这么多,你可能还不明白,那么接着往下看吧。
[static] void QDesktopServices::setUrlHandler(const QString & scheme, QObject * receiver, const char * method)

将给定方案的处理程序设置为接收方对象提供的处理程序方法。

这个函数提供了一种自定义openUrl()行为的方法。如果使用指定方案的URL调用openUrl(),则调用接收方对象上的给定方法,而不是QDesktopServices启动外部应用程序。

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

如果setUrlHandler()用于为已经有处理程序的方案设置新的处理程序,则现有的处理程序将简单地用新的处理程序替换。由于QDesktopServices不获得处理程序的所有权,因此在替换处理程序时不会删除对象。

注意,处理程序总是在调用QDesktopServices::openUrl()的线程中被调用。

请参见openUrl()和unsetUrlHandler()。


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

移除先前为指定方案设置的URL处理程序。

参见setUrlHandler()。

这里补充说一下QDesktopServices::setUrlHandler的3个参数:

  • const QString & scheme:方案名称,我们这里假设方案名称为plan
  • QObject * receiver:一个类的实例对象的指针,我们这里假设类名为A
  • const char * method:取代QDesktopServices::openUrl()默认行为的一个A类的成员函数

还要补充说一下如何让QDesktopServices::setUrlHandler生效:

  • 先调用setUrlHandler再调用openUrl
  • 然后要保证url是以plan开头的,因为我们调用setUrlHandler指定的方案名是“plan
  • url中不要加空格

例如

class A
{

};

A objA;

QDesktopServices::setUrlHandler("plan", &objA, "showHelp");
QDesktopServices::openUrl(QUrl("plan://showthisword/", QUrl::TolerantMode));

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值