如何使用QDesktopServices::openUrl 'file:'包含"#"的URL?



在我的应用程序中,我生成了一个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));

并在默认浏览器中打开。

但是当字符#出现在路径或文件名中时,它不再工作,并且似乎URL在#之后被截断。

例如,如果我将文件命名为generated#_html_file.html,我得到这个错误消息:

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

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

在URL中,#是一个从资源位置分隔'片段标识符'的字符。要用字面量#引用file: URL,需要对其进行转义(如%23)。

参考文献:RFC 1738:

字符"#"是不安全的,应该始终进行编码,因为它用于在万维网和其他系统中,将URL从片段/锚的标识符。

正如SteveTJS所指出的,为此目的提供了静态方法QUrl::fromLocalFile(),因此您可以编写

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

QDesktopServices::openUrl(QUrl(file));

这将

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

我刚刚找到了解决方案:

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

相关内容

  • 没有找到相关文章

最新更新