項目作到必定階段,常常須要在原來的工程上調用外部程序。Qt爲此提供了QProcess類,QProcess可用於完成啓動外部程序,並與之交互通訊。
1、啓動外部程序的兩種方式:
(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。
例如:
html
//1-不帶空格,能夠啓動 併發
process->start("F:/AppInst/115/115com/115com.exe");
函數
//2-帶空格,沒法啓動 spa
process->start("C:/Program Files/HaoZip/HaoZip.exe");
.net
//3-帶空格,使用帶參模式,能夠啓動 線程
process->start("C:/Program Files/HaoZip/HaoZip.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe")); htm
2、啓動以前須要作的工做:
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官方自帶的例子:
blog
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()已經整合了上面的三個步驟,若是須要分別設置,請採用以上的方式。
3、啓動狀態
外部程序未啓動時,其狀態是NotRunning;
當啓動時,其狀態轉變爲Starting,正在啓動,但此時還未調用起來;
啓動以後,繼續變爲Running,同時發射出started()信號,此時,能夠對QProcess進行讀寫操做了;
當退出時,其狀態改成NotRunning,併發射出finished()信號。finishe()信號會攜帶退出碼和退出狀態,能夠分別經過exitCode()和exitStatus()來得到。
當發生錯誤時,QProcess會發出一個error()信號,一樣的,也能夠經過error()來得到其錯誤類型,經過state()得到當前程序的狀態。
4、QProcess 與 QIODevice
QProcess繼承於QIODevice,所以,咱們能夠把它看成是一個I/O設備進行讀寫操做。
5、交互
QProcess有兩種預約義的輸出通道:標準輸出stdout與標準錯誤stderr。
經過setReadChannel()能夠選擇當前讀取輸出的通道。
當通道中的數據準備就緒時,QProcess會發出readyRead()信號。若是是標準輸出,則發出readyReadStandardOutput()信號;若是是標準錯誤,則發出readyReadStandardError()信號。
經常使用的讀取方式有read(), readAll()或getChar(),也能夠經過readAllStandardOutput()和readAllStandardError()讀取標準輸出和標準錯誤通道中的數據。
某些程序須要環境設置才能進行特殊的操做。能夠經過setEnvironment()來設置環境變量,經過setWorkingDirectory()來設置工做目錄,默認的工做路徑是當前調用程序的工做路徑。
6、Synchronous Process API (同步進程API)
QProcess提供了一系列的函數以提到事件循環來完成同步操做:
(1)waitForStarted() : 阻塞,直到外部程序啓動
(2)waitForReadyRead() : 阻塞,直到輸出通道中的新數據可讀
(3)waitForBytesWritten() : 阻塞,直到輸入通道中的數據被寫入
(4)waitForFinished() : 阻塞,直到外部程序結束
若是在主線程(QApplication::exec())中調用這些函數,可能會形成當前用戶界面不響應。
7、主要API
請參考Qt的官方說明:QProcess Class
PS:參考連接
從QProcess說開來(一)
從QProcess說開來(二)
個人CSDN博客:http://blog.csdn.net/jan5_reyn