写点什么

Qt 软件开发 _ 解决中文路径无法识别问题

作者:DS小龙哥
  • 2022 年 5 月 17 日
  • 本文字数:1876 字

    阅读完需:约 6 分钟

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()<<qba;
复制代码

(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()<<qba;
复制代码

(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()<<qba;
复制代码


发布于: 43 分钟前阅读数: 4
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
Qt软件开发_解决中文路径无法识别问题_5月月更_DS小龙哥_InfoQ写作社区