目录
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个参数可选值如下:
Constant | Value | Description |
QUrl::TolerantMode | 0 | QUrl将试图纠正一些常见的错误的url。这种模式对于解析来自不完全符合标准的源的url非常有用。 |
QUrl::StrictMode | 1 | 只接受有效的url。这种模式对于一般的URL验证很有用。 |
QUrl::DecodedMode | 2 | QUrl将以完全解码的形式解释URL组件,其中百分比字符代表它们自己,而不是百分比编码序列的开始。此模式仅对URL的setter设置组件有效;在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));