如果路径包含空格,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”之后)的主要内容,如果未能解决你的问题,请参考以下文章