QDesktopServices::openUrl() 如果路径包含空格("apt-get upgrade" 后)失败

QDesktopServices::openUrl() fails if path contains spaces (after "apt-get upgrade")

本文关键字:apt-get upgrade 失败 路径 openUrl 如果 QDesktopServices 包含 空格      更新时间:2023-10-16

我最近在以前工作正常的程序上看到了这个错误。我认为错误在我执行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:///

在 Qt5 上

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

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

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

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

要么用 \ 转义空格

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

或在路径中添加引号:-

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