【摘要】 在QT for Windows 下編程時(shí),經(jīng)常因?yàn)橐恍┲形穆窂健Э崭竦穆窂綄?dǎo)致一些問(wèn)題出現(xiàn)。 目錄無(wú)法打開(kāi)、文件無(wú)法打開(kāi)、程序無(wú)法調(diào)用等等。下面記錄一些出現(xiàn)問(wèn)題的場(chǎng)景,并提供一些解決辦法。
1. 前言
在QT for Windows 下編程時(shí),經(jīng)常因?yàn)橐恍┲形穆窂健Э崭竦穆窂綄?dǎo)致一些問(wèn)題出現(xiàn)。
目錄無(wú)法打開(kāi)、文件無(wú)法打開(kāi)、程序無(wú)法調(diào)用等等。下面記錄一些出現(xiàn)問(wèn)題的場(chǎng)景,并提供一些解決辦法。
2. _chdir切換帶空格的目錄
chdir 是C語(yǔ)言中的一個(gè)系統(tǒng)調(diào)用函數(shù)(同cd),用于改變當(dāng)前工作目錄,其參數(shù)為Path 目標(biāo)目錄,可以是絕對(duì)目錄或相對(duì)目錄。
在Qt里調(diào)用_chdir函數(shù)切換當(dāng)前工作目錄時(shí),如果目錄有空格或者中文會(huì)導(dǎo)致路徑切換失敗。
(1)切換失敗的情況
//切換路徑
void MainWindow::on_pushButton_clicked()
{
QString strAppPath ="D:\\360安全瀏覽器下載";
qDebug() << "strAppPath:" << strAppPath;
QByteArray utf8_array = strAppPath.toUtf8();
qDebug()<<"路徑切換狀態(tài):"<<_chdir(utf8_array.data()); //切換工作目錄
//切換失敗:
//路徑切換狀態(tài): -1
}
(2)優(yōu)化后-解決問(wèn)題
QString strAppPath ="D:/360安全瀏覽器下載";
qDebug() << "strAppPath:" << strAppPath;
QTextCodec *code = QTextCodec::codecForName("GB2312");//解決中文路徑問(wèn)題
std::string name = code->fromUnicode(strAppPath).data();
QByteArray utf8_array = name.c_str();
qDebug()<<"路徑切換狀態(tài):"<<_chdir(name.c_str()); //切換工作目錄
3. QProcess執(zhí)行-目錄帶中文
QProcess類用于啟動(dòng)外部程序并與它們通信。
運(yùn)行進(jìn)程要啟動(dòng)進(jìn)程,請(qǐng)將要運(yùn)行的程序的名稱和命令行參數(shù)作為參數(shù)傳遞給start()。參數(shù)在QStringList中作為單個(gè)字符串提供。
或者,可以將程序設(shè)置為使用setProgram()和setArguments()運(yùn)行,然后調(diào)用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進(jìn)入啟動(dòng)狀態(tài),程序啟動(dòng)后,QProcess進(jìn)入運(yùn)行狀態(tài)并發(fā)出started()。
QProcess允許將進(jìn)程視為順序I/O設(shè)備。可以像使用QTcpSocket訪問(wèn)網(wǎng)絡(luò)連接一樣,對(duì)進(jìn)程進(jìn)行寫(xiě)入和讀取。然后可以通過(guò)調(diào)用write()寫(xiě)入進(jìn)程的標(biāo)準(zhǔn)輸入,并通過(guò)調(diào)用read()、readLine()和getChar()讀取標(biāo)準(zhǔn)輸出。因?yàn)镼Process繼承了QIODevice,所以它也可以用作QXmlReader的輸入源,或者用于生成要使用QNetworkAccessManager上傳的數(shù)據(jù)。
當(dāng)進(jìn)程退出時(shí),QProcess重新進(jìn)入NotRunning狀態(tài)(初始狀態(tài)),并發(fā)出finished()。
finished()信號(hào)提供進(jìn)程的退出代碼和退出狀態(tài)作為參數(shù),還可以調(diào)用exitCode()來(lái)獲取最后一個(gè)完成的進(jìn)程的退出代碼,并調(diào)用exitStatus()來(lái)獲取其退出狀態(tài)。如果在任何時(shí)間點(diǎn)發(fā)生錯(cuò)誤,QProcess將發(fā)出ErrorOccursed()信號(hào)。還可以調(diào)用error()來(lái)查找上次發(fā)生的錯(cuò)誤類型,調(diào)用state()來(lái)查找當(dāng)前進(jìn)程狀態(tài)。
使用QProcess調(diào)用啟動(dòng)指定的應(yīng)用程序,如果這個(gè)應(yīng)用程序在中文路徑下。直接使用QProcess 調(diào)用會(huì)失敗,就就算使用QProcess設(shè)置工作路徑也沒(méi)有用,必須切換到應(yīng)用程序所在的目錄下,然后使用相對(duì)路徑運(yùn)行。
(1)調(diào)用失敗的情況
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");//解決中文路徑問(wèn)題
std::string name = code->fromUnicode(strAppPath).data();
QByteArray utf8_array = name.c_str();
qDebug()<<"路徑切換狀態(tài):"<<_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()<;<>
-
嵌入式
+關(guān)注
關(guān)注
5087文章
19153瀏覽量
306415 -
WINDOWS
+關(guān)注
關(guān)注
4文章
3553瀏覽量
88986 -
Qt
+關(guān)注
關(guān)注
1文章
308瀏覽量
37988
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論