【摘要】 在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()<;<>
-
嵌入式
+關注
關注
5138文章
19524瀏覽量
314705 -
WINDOWS
+關注
關注
4文章
3606瀏覽量
90909 -
Qt
+關注
關注
1文章
313瀏覽量
38771
發布評論請先 登錄
Qt軟件開發-QSettings管理用戶環境變量(修改、輸出)

USB3.0的識別問題
BAT文件無法識別中文路徑
如何解決網絡無法識別問題
【創龍科技TL570x-EVM開發板試用體驗】TL570x-EVM 的QT軟件開發
嵌入式軟件開發
關于做嵌入式軟件開發和普通桌面軟件開發的區別問題

基于模型的嵌入式軟件開發

汽車軟件開發流程介紹
安全軟件開發的最佳實踐

評論