在我的应用程序中,我生成一个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).
为什么会发生这种情况,我该如何避免呢?
答案 0 :(得分:10)
在URL中,#
是一个字符,用于界定资源位置的“片段标识符”。要使用文字file:
引用#
网址,需要对其进行转义(%23
)。
参考:RFC 1738:
角色 “#”是不安全的,应始终进行编码,因为它用于 万维网和其他系统中用于分隔URL的URL 可能跟随它的片段/锚标识符。
正如SteveTJS所述,静态方法QUrl::fromLocalFile()
是为此目的而提供的,所以你可以写
QDesktopServices::openUrl(QUrl::fromLocalFile(file));
而不是
QDesktopServices::openUrl(QUrl(file));
这将
file:
协议标识符和//
空主机名/
(如果不同)答案 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