如果路径包含空格,QDesktopServices::openUrl() 将失败(在“apt-get upgrade”之后)

Posted

技术标签:

【中文标题】如果路径包含空格,QDesktopServices::openUrl() 将失败(在“apt-get upgrade”之后)【英文标题】:QDesktopServices::openUrl() fails if path contains spaces (after "apt-get upgrade") 【发布时间】:2014-11-21 12:43:28 【问题描述】:

我最近在以前可以正常工作的程序上看到了这个错误。我认为在我执行sudo apt-get upgrade 之后开始出现错误,这可能已经升级了我机器上的 Qt 库。

我已经为包含此代码的新创建项目重现了此错误:

QDesktopServices::openUrl(QUrl("/home/sashoalm/Has Spaces.txt"));
QDesktopServices::openUrl(QUrl::fromLocalFile("/home/sashoalm/Has Spaces.txt"));

这会产生 2 个消息框,内容相同 - /home/sashoalm/Has%20Spaces.txt: No such file or directory。但是该文件存在 - 例如,我已验证 xdg-open "/home/sashoalm/Has Spaces.txt" 可以正常工作。

有什么解决方法吗?这个错误是什么时候发生的?我的操作系统是 Debian Wheezy。

编辑:我查了Qt4的源码,相关代码是这样的(来自qdesktopservices_x11.cpp):

return (QProcess::startDetached(client + QLatin1Char(' ') + QString::fromLatin1(url.toEncoded().constData())));

QUrl::toEncoded() 将百分比编码路径返回为file:///home/sashoalm/Has%20Spaces.txt。奇怪的是,自 2011 年之前,除了更新版权声明外,该文件没有任何变化。所以这不可能是 Qt 中的变化。但是 QDesktopServices::openUrl() 发出的命令是xdg-open file:///home/sashoalm/Has%20Spaces.txt,这在我的电脑上不起作用。也许它以前可以工作,并且对 xdg-open 本身的更新破坏了它?有谁知道 xdg-open 是否应该使用百分比编码处理file:///

【问题讨论】:

嗯,奇怪。 QDesktopServices::openUrl(QUrl::fromLocalFile("d:\\a b\\c d.txt")); 在 Windows 上运行良好。 【参考方案1】:

用 \ 转义空格

QUrl("/home/sashoalm/Has\ Spaces.txt")

或在路径中添加引号:-

QUrl("\"/home/sashoalm/Has Spaces\"")

【讨论】:

呃,第一行的第一个反斜杠会被编译器捕获,而第二行的最后一个符号是斜杠 /" 而不是 \",而不是反斜杠,所以它不会甚至编译。无论如何我都对它们进行了测试,但它们的效果不够好。 对不起,我关于最后一个斜杠的错误,应该是一个反斜杠。我在这里更正了。如果使用带有路径的 QFileInfo 对象,QfileInfo::exists() 是否返回 true?关于编译器的要点,您可能需要将它们放在一起并用反斜杠转义空格,但也用引号转义整个字符串。 查看我的编辑,问题与此无关,建议的解决方案仍然不起作用。 xdg-open 更可能出现问题,它不处理百分比编码的 url,这就是 QDesktopServices::openUrl() 所做的,我查看了源代码,并发布了代码的相关部分。请记住,即使是引号也会被百分比编码,所以它仍然会失败。另外,我写道我已经验证它已经存在。 您写道,您通过直接调用 xdg-open 来验证它存在,这与从 QDesktopServices 调用它并不完全相同。如果问题出在 QDesktopServices 上,那么使用 QProcess 并用它调用“xdg-open”怎么样?【参考方案2】:

在 Qt5 上

QDesktopServices::openUrl(QUrl::fromLocalFile("/home/sashoalm/Has Spaces.txt"));

工作得很好。纯粹从第一行的 QUrl 加载文件时,我遇到了同样的问题

QDesktopServices::openUrl(QUrl("/home/sashoalm/Has Spaces.txt"));

但是当使用 QUrl::fromLocalFile 时它只是做了这件事

【讨论】:

以上是关于如果路径包含空格,QDesktopServices::openUrl() 将失败(在“apt-get upgrade”之后)的主要内容,如果未能解决你的问题,请参考以下文章

shell 路径包含空格怎么办

CLI 上的 NMake 宏定义,其中包含一个空格

QT QDesktopServices 远程访问共享文件夹

Cygwin:使用包含 Windows 路径的路径变量(其中包含空格)

oracle主目录路径不能包含空格

如何转义包含空格的路径