如何将QDesktopServices :: openUrl与包含'#'的'file:'URL一起使用?

时间:2015-07-22 12:51:50

标签: qt qurl qdesktopservices

在我的应用程序中,我生成一个HTML文件,我想通过单击按钮打开它。 所以我的文件被命名,例如:

QString file = "F:/the_path/to_the_/generated_html_file.html";

在Windows上我将其更改为:

file = "file:///F:/the_path/to_the_/generated_html_file.html";

这样我就可以用:

打开它
QDesktopServices::openUrl(QUrl(file));

并在默认浏览器中打开。

但是当路径或文件名中出现字符#时,它不再起作用,而且似乎在#之后截断了该网址。

例如,如果我将文件命名为generated#_html_file.html,则会收到以下错误消息:

ShellExecute 'F:/the_path/to_the_/generated' failed (error 2).

为什么会发生这种情况,我该如何避免呢?

2 个答案:

答案 0 :(得分:10)

在URL中,#是一个字符,用于界定资源位置的“片段标识符”。要使用文字file:引用#网址,需要对其进行转义(%23)。

参考:RFC 1738:

  

角色   “#”是不安全的,应始终进行编码,因为它用于   万维网和其他系统中用于分隔URL的URL   可能跟随它的片段/锚标识符。

正如SteveTJS所述,静态方法QUrl::fromLocalFile()是为此目的而提供的,所以你可以写

QDesktopServices::openUrl(QUrl::fromLocalFile(file));

而不是

QDesktopServices::openUrl(QUrl(file));

这将

  1. 添加file:协议标识符和//空主机名
  2. 将原生路径分隔符转换为/(如果不同)
  3. 为网址编码任何非安全字符。

答案 1 :(得分:5)

我刚刚找到解决方案:

QString file = "F:/the_path/to_the_/generated#_html_file.html";
QUrl url = QUrl::fromLocalFile(file);
// gives url="file:///F:/the_path/to_the_/generated%23_html_file.html";
QDesktopServices::openUrl(url); //works