0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-09-09 11:36 次阅读

【摘要】 在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
}
image-20220418103611311

(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()); //切换工作目录
image-20220418135921641

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

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()<;<>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5069

    文章

    19021

    浏览量

    303408
  • WINDOWS
    +关注

    关注

    3

    文章

    3524

    浏览量

    88441
  • Qt
    Qt
    +关注

    关注

    1

    文章

    301

    浏览量

    37835
收藏 人收藏

    评论

    相关推荐

    Qt软件开发-QSettings管理用户环境变量(修改、输出)

    软件开发中可能有需求修改用户环境变量,添加新的值进行。比如:添加某些可执行文件、某些动态库的路径到系统环境PATH中,能够让可执行文件运行过程中可以找到对应的dll。
    的头像 发表于 07-14 13:46 2899次阅读
    <b class='flag-5'>Qt</b><b class='flag-5'>软件开发</b>-QSettings管理用户环境变量(修改、输出)

    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

    Qt 嵌入式图形开发(基础篇)

    Qt是一个支持多操作系统的应用开发框架,它使用的c++语言。Qt最初主要为跨平台的软件开发提供平台。
    发表于 05-25 16:55 123次下载
    <b class='flag-5'>Qt</b> 嵌入式图形<b class='flag-5'>开发</b>(基础篇)

    ARM嵌入式软件开发

    ARM嵌入式软件开发ARM嵌入式软件开发ARM嵌入式软件开发
    发表于 01-15 17:29 64次下载

    Linux软件开发环境

    Linux软件开发环境介绍。
    发表于 03-25 15:46 7次下载
    Linux<b class='flag-5'>软件开发</b>环境

    关于做嵌入式软件开发和普通桌面软件开发的区别问

    前几天别人问我做嵌入式开发和普通桌面开发有什么区别,当时回答的不全面,今天来总结一下:嵌入式开发在宿主机上编辑、编译程序,在目标机运行测试程序,称为交叉开发;普通桌面
    发表于 10-21 10:06 4次下载
    关于做嵌入式<b class='flag-5'>软件开发</b>和普通桌面<b class='flag-5'>软件开发</b>的区<b class='flag-5'>别问</b>题

    基于模型的嵌入式软件开发

    对工具的分类和资质审核通过认证的方式发放证书应对复杂系统时,软件开发人员的工作效率在降低解决复杂软件开发效率低下的路径:模块化开发 (一个复杂的系统包含很多模块,每个模块都比较简单,这
    发表于 11-03 11:21 9次下载
    基于模型的嵌入式<b class='flag-5'>软件开发</b>

    汽车软件开发流程介绍

    在汽车软件开发中,软件开发流程是软件工程的核心,因为它们为软件开发实践“提供了一个骨架并确保了它的严谨性”。软件开发的流程包含“阶段”“活动
    发表于 08-15 12:03 1.4w次阅读

    软件开发的流程和方法有哪些?

    软件开发是根据客户要求构建出软件系统或者系统中的软件部分,一般是通过程序设计语言实现的,比如C/C++/JAVA/JSP/ASP等开发语言。软件开发
    的头像 发表于 12-27 10:56 2074次阅读
    <b class='flag-5'>软件开发</b>的流程和方法有哪些?

    安全软件开发的最佳实践

    安全的软件开发最佳实践是必要的,因为安全风险无处不在。在网络攻击盛行的时代,它们可以影响每个人,包括个人、公司和政府。因此,确保软件开发的安全性至关重要。 在这里,我们将解释了什么是安全软件,如何确保
    的头像 发表于 05-08 10:51 793次阅读
    安全<b class='flag-5'>软件开发</b>的最佳实践

    嵌入式软件开发软件开发的区别

    嵌入式软件开发软件开发是两个不同的概念,它们在一些关键方面有着明显的区别。嵌入式软件开发是指开发嵌入在硬件设备中的软件,而
    的头像 发表于 01-22 15:27 2182次阅读