QDesktopServices::openUrl() 如果路径包含空格("apt-get upgrade" 后)失败
QDesktopServices::openUrl() fails if path contains spaces (after "apt-get upgrade")
我最近在以前工作正常的程序上看到了这个错误。我认为错误在我执行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"")
- Cpp-Tuple使用带有变量的get
- 通过 get-Method 访问变量在类外不起作用
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++中是否有任何函数等同于python中字典的get函数?
- 使用istringstearm和get行缓慢读取文件
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 使用 cin.get() 初始化字符数组
- std::variant<>::get() 不能使用 Apple LLVM 10.0 编译
- 编写 cin.get() 以接收字符数组时出现问题
- 作用域枚举和标准::get
- Visual Studio 2017 中的 cpprestapi 问题找不到 POST/GET 常量
- 在 C++/C 中使用 CURL 发出带有数据文件的 GET HTTP 请求
- 使用"push_back"作为带有"get"函数C++的向量
- 使用 cin.get 读取字符数组
- QDesktopServices::openUrl() 如果路径包含空格("apt-get upgrade" 后)失败
- 如何在ubuntu 14.04中通过apt-get安装gcc/g++的早期版本(4.4.7)
- 在apt-get安装后没有找到LLVM头文件
- 使用Qt(QProcess)运行apt-get
- Ubuntu : apt-get install <package> 等效于 C++ apt-pkg 库中