【摘要】 在QT for Windows 下编程时,经常因为一些中文路径、带空格的路径导致一些问题出现。 目录无法打开、文件无法打开、程序无法调用等等。下面记录一些出现问题的场景,并提供一些解决办法。
1. 前言
在QT for Windows 下编程时,经常因为一些中文路径、带空格的路径导致一些问题出现。
目录无法打开、文件无法打开、程序无法调用等等。下面记录一些出现问题的场景,并提供一些解决办法。
2. _chdir切换带空格的目录
chdir 是C语言中的一个系统调用函数(同cd),用于改变当前工作目录,其参数为Path 目标目录,可以是绝对目录或相对目录。
在Qt里调用_chdir函数切换当前工作目录时,如果目录有空格或者中文会导致路径切换失败。
(1)切换失败的情况
//切换路径
void MainWindow::on_pushButton_clicked()
{
QString strAppPath ="D:\\360安全浏览器下载";
qDebug() << "strAppPath:" << strAppPath;
QByteArray utf8_array = strAppPath.toUtf8();
qDebug()<<"路径切换状态:"<<_chdir(utf8_array.data()); //切换工作目录
//切换失败:
//路径切换状态: -1
}
(2)优化后-解决问题
QString strAppPath ="D:/360安全浏览器下载";
qDebug() << "strAppPath:" << strAppPath;
QTextCodec *code = QTextCodec::codecForName("GB2312");//解决中文路径问题
std::string name = code->fromUnicode(strAppPath).data();
QByteArray utf8_array = name.c_str();
qDebug()<<"路径切换状态:"<<_chdir(name.c_str()); //切换工作目录
3. QProcess执行-目录带中文
QProcess类用于启动外部程序并与它们通信。
运行进程要启动进程,请将要运行的程序的名称和命令行参数作为参数传递给start()。参数在QStringList中作为单个字符串提供。
或者,可以将程序设置为使用setProgram()和setArguments()运行,然后调用start()或open()。
QObject *parent;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
然后,QProcess进入启动状态,程序启动后,QProcess进入运行状态并发出started()。
QProcess允许将进程视为顺序I/O设备。可以像使用QTcpSocket访问网络连接一样,对进程进行写入和读取。然后可以通过调用write()写入进程的标准输入,并通过调用read()、readLine()和getChar()读取标准输出。因为QProcess继承了QIODevice,所以它也可以用作QXmlReader的输入源,或者用于生成要使用QNetworkAccessManager上传的数据。
当进程退出时,QProcess重新进入NotRunning状态(初始状态),并发出finished()。
finished()信号提供进程的退出代码和退出状态作为参数,还可以调用exitCode()来获取最后一个完成的进程的退出代码,并调用exitStatus()来获取其退出状态。如果在任何时间点发生错误,QProcess将发出ErrorOccursed()信号。还可以调用error()来查找上次发生的错误类型,调用state()来查找当前进程状态。
使用QProcess调用启动指定的应用程序,如果这个应用程序在中文路径下。直接使用QProcess 调用会失败,就就算使用QProcess设置工作路径也没有用,必须切换到应用程序所在的目录下,然后使用相对路径运行。
(1)调用失败的情况
QProcess process;
process.start("D:\\linux-share-dir\\我是中文路径\\Program Files\\Release\\ff_video.exe -v quiet -of json -i D:/汽车零件装配.MP4 -show_streams");
process.waitForFinished();
process.waitForReadyRead();
QByteArray qba = process.readAll();
qDebug()<;>
(2)切换目录解决-_chdir
QString strAppPath ="D:\\linux-share-dir\\我是中文路径\\Program Files\\Release\";
qDebug() << "strAppPath:" << strAppPath;
QTextCodec *code = QTextCodec::codecForName("GB2312");//解决中文路径问题
std::string name = code->fromUnicode(strAppPath).data();
QByteArray utf8_array = name.c_str();
qDebug()<<"路径切换状态:"<<_chdir(name.c_str()); //切换工作目录
QProcess process;
process.start("ff_video.exe -v quiet -of json -i \"D:/汽车零件装配.MP4\" -show_streams");
process.waitForFinished();
process.waitForReadyRead();
QByteArray qba = process.readAll();
qDebug()<;>
(3)切换目录解决-QDir
(3)切换目录解决-QDir
QDir::setCurrent("D:\\linux-share-dir\\我是中文路径\\Program Files\\Release\");
QProcess process;
process.start("ff_video.exe -v quiet -of json -i "D:/汽车零件装配.MP4" -show_streams");
process.waitForFinished();
process.waitForReadyRead();
QByteArray qba = process.readAll();
qDebug()<;<>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
5082文章
19123浏览量
305154 -
WINDOWS
+关注
关注
3文章
3545浏览量
88690 -
Qt
+关注
关注
1文章
302浏览量
37917
发布评论请先 登录
相关推荐
Qt软件开发-QSettings管理用户环境变量(修改、输出)
在软件开发中可能有需求修改用户环境变量,添加新的值进行。比如:添加某些可执行文件、某些动态库的路径到系统环境PATH中,能够让可执行文件运行过程中可以找到对应的dll。
USB3.0的识别问题
做了一个USB3.0集线器,现在遇到这个问题,USB3.0无法识别,插拔几次后可以识别,接上其他设备也能正常工作,求高手帮忙啊,怎么处理USB3.0识别问题
发表于 10-29 11:36
BAT文件无法识别中文路径
文件无法识别中文路径。它只会出现在旧版本中。谁能告诉我什么时候解决。感谢您的回复!以上来自于谷歌翻译以下为原文OS: Windows XP Professional Chinese
发表于 11-16 11:43
如何解决网络无法识别问题
网络问题分类网络无法识别问题还是比较好排查,但是如果涉及到网络丢包牵扯的环节太多了比如交换芯片是否异常,对方的工作模式是否正常、网络隔离变压器是否正常、CPU占用率、设备中断影响先排除网络环境和对方设备、在确认设备问题比如phy的时钟是否重叠、phy的流控是否开启等等..
发表于 12-23 06:08
【创龙科技TL570x-EVM开发板试用体验】TL570x-EVM 的QT软件开发
创龙TL5708-EVM QT软件开发 作者:大信 8125036 通过对创龙TL5708初步使用体验后,开始着手更进一步的进行软件开发,以便充分发挥板子的强大功能。首先建立开发板的主
发表于 06-13 17:13
嵌入式软件开发
嵌入式软件开发,小家电,esp32视觉,esp8266物联网,各种2G\\4G物联网产品开发,C\\C++\\C#,QT上位机开发,有需要的老板可以加我微,18802689896
发表于 09-05 14:13
关于做嵌入式软件开发和普通桌面软件开发的区别问题
前几天别人问我做嵌入式开发和普通桌面开发有什么区别,当时回答的不全面,今天来总结一下:嵌入式开发在宿主机上编辑、编译程序,在目标机运行测试程序,称为交叉开发;普通桌面
发表于 10-21 10:06
•4次下载
基于模型的嵌入式软件开发
对工具的分类和资质审核通过认证的方式发放证书应对复杂系统时,软件开发人员的工作效率在降低解决复杂软件开发效率低下的路径:模块化开发 (一个复杂的系统包含很多模块,每个模块都比较简单,这
发表于 11-03 11:21
•9次下载
汽车软件开发流程介绍
在汽车软件开发中,软件开发流程是软件工程的核心,因为它们为软件开发实践“提供了一个骨架并确保了它的严谨性”。软件开发的流程包含“阶段”“活动
发表于 08-15 12:03
•1.5w次阅读
安全软件开发的最佳实践
安全的软件开发最佳实践是必要的,因为安全风险无处不在。在网络攻击盛行的时代,它们可以影响每个人,包括个人、公司和政府。因此,确保软件开发的安全性至关重要。
在这里,我们将解释了什么是安全软件,如何确保
嵌入式软件开发和软件开发的区别
嵌入式软件开发和软件开发是两个不同的概念,它们在一些关键方面有着明显的区别。嵌入式软件开发是指开发嵌入在硬件设备中的软件,而
评论