Qt技巧:QProcess與外部程式的呼叫
專案做到一定階段,常常須要在原來的project上呼叫外部程式。
Qt為此提供了QProcess類,QProcess可用於完畢啟動外部程式,並與之互動通訊。
一、啟動外部程式的兩種方式:
(1)一體式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)
外部程式啟動後。將隨主程式的退出而退出。
(2)分離式:void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0)
外部程式啟動後,當主程式退出時並不退出。而是繼續執行。
值得注意的是。當程式路徑中含有空格的時候,僅設定程式路徑program是無法被識別的。解決方法是再將程式路徑傳遞給arguments。
比如:
//1-不帶空格。能夠啟動 process->start("F:/AppInst/115/115com/115com.exe"); //2-帶空格,無法啟動 process->start("C:/Program Files/HaoZip/HaoZip.exe"); //3-帶空格,使用帶參模式。能夠啟動 process->start("C:/Program Files/HaoZip/HaoZip.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe"));
二、啟動之前須要做的工作:
To start a process, pass the name and command line arguments of the program you want to run as arguments to start(). Arguments are supplied as individual strings in a QStringList.
啟動一個外部程式,須要傳遞外部程式的路徑和執行引數。引數用QStringList來帶入。
(1)設定路徑: void QProcess::setProgram(const QString & program)
(2)設定引數[可選]: void QProcess:: setArguments(const QStringList & arguments)
(3)啟動: void QProcess::start(OpenMode mode = ReadWrite)
Qt官方自帶的樣例:
QObject *parent;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
事實上。start()或startDetached()已經整合了上面的三個步驟。假設須要分別設定,請採用以上的方式。
三、啟動狀態
外部程式未啟動時。其狀態是NotRunning;
當啟動時,其狀態轉變為Starting,正在啟動。但此時還未呼叫起來。
啟動之後,繼續變為Running,同一時候發射出started()訊號,此時,能夠對QProcess進行讀寫操作了。
當退出時,其狀態改為NotRunning。併發射出finished()訊號。finishe()訊號會攜帶退出碼和退出狀態,能夠分別通過exitCode()和exitStatus()來獲得。
當錯誤發生時,QProcess會發出一個error()訊號。相同的。也能夠通過error()來獲得其錯誤型別,通過state()獲得當前程式的狀態。
四、QProcess 與 QIODevice
QProcess繼承於QIODevice,因此。我們能夠把它當作是一個I/O裝置進行讀寫操作。
五、互動
QProcess有兩種提前定義的輸出通道:標準輸出stdout與標準錯誤stderr。
通過setReadChannel()能夠選擇當前讀取輸出的通道。
當通道中的資料準備就緒時。QProcess會發出readyRead()訊號。假設是標準輸出。則發出readyReadStandardOutput()訊號。假設是標準錯誤,則發出readyReadStandardError()訊號。
經常使用的讀取方式有read(), readAll()或getChar(),也能夠通過readAllStandardOutput()和readAllStandardError()讀取標準輸出和標準錯誤通道中的資料。
某些程式須要環境設定才幹進行特殊的操作。能夠通過setEnvironment()來環境變數設定,通過setWorkingDirectory()來設定工作資料夾,預設的工作路徑是當前呼叫程式的工作路徑。
六、Synchronous Process API (同步程序API)
QProcess提供了一系列的函式以提到事件迴圈來完畢同步操作:
(1)waitForStarted() : 堵塞。直到外部程式啟動
(2)waitForReadyRead() : 堵塞,直到輸出通道中的新資料可讀
(3)waitForBytesWritten() : 堵塞,直到輸入通道中的資料被寫入
(4)waitForFinished() : 堵塞,直到外部程式結束
假設在主執行緒(QApplication::exec())中呼叫這些函式,可能會造成當前使用者介面不響應。
七、主要API
請參考Qt的官方說明:QProcess Class
PS:參考連結
從QProcess說開來(一)
從QProcess說開來(二)