項目做到一定階段,經常需要在原來的工程上調用外部程式。Qt為此提供了QProcess類,QProces s可用於完成啟動外部程式,並與之互動通訊。
一、啟動外部程式的兩種方式:
(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裝置進行讀寫操作。