【摘要】 在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()<;<>
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5069文章
19021瀏覽量
303375 -
WINDOWS
+關注
關注
3文章
3524瀏覽量
88437 -
Qt
+關注
關注
1文章
301瀏覽量
37834
發布評論請先 登錄
相關推薦
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.4w次閱讀
安全軟件開發的最佳實踐
安全的軟件開發最佳實踐是必要的,因為安全風險無處不在。在網絡攻擊盛行的時代,它們可以影響每個人,包括個人、公司和政府。因此,確保軟件開發的安全性至關重要。
在這里,我們將解釋了什么是安全軟件,如何確保
嵌入式軟件開發和軟件開發的區別
嵌入式軟件開發和軟件開發是兩個不同的概念,它們在一些關鍵方面有著明顯的區別。嵌入式軟件開發是指開發嵌入在硬件設備中的軟件,而
評論