簡介:
可用於完成啟動外部程序,並與之交互通信。
啟動一個進程的名字叫“program”,如果某進程的路徑沒有設置成環境變量,“program”需要包含路徑
如果進程可以接收參數,參數叫“argument”
把“program”和“argument”和在一起叫“command”
部分方法說明:
void QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite)
會啟動一個新的進程,如果某個 QProcess 對象已經啟動了一個進程,此對象再次調用此方法會啟動一個新進程,造成兩個進程存在的情況(不推薦,第一個進程不受控制)
void QProcess::start(const QString &command, OpenMode mode = ReadWrite)
會啟動一個新的進程
void QProcess::start(OpenMode mode = ReadWrite)
不會啟動新進程,
bool QProcess::waitForFinished(int msecs = 30000)
等待進程結束,如果進程是 cmd.exe,可以在cmd的參數里面加“/c”,這樣執行完一條指令,cmd.exe進程就退出了,但是如果沒有在參數里面加"/c",默認等待30s,然后使用方法 readAllStandardOutput() 讀出的也不是執行參數所返回的結果
void QProcess::close()
殺死進程
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)
外部程序啟動后,當主程序退出時並不退出,而是繼續運行。
3)分步設置
設置路徑
void QProcess::setProgram(const QString & program)
設置參數【可選】
void QProcess::setArguments(const QStringList & arguments)
啟動
選擇啟動函數(兩種方式,start()或open())
二、狀態
外部程序未啟動時,其狀態是NotRunning;
當啟動時,其狀態轉變為Starting,正在啟動,但此時還未調用起來;
啟動之后,繼續變為Running,同時發射出started()信號,此時,可以對QProcess進行讀寫操作了;
當退出時,其狀態改為NotRunning,並發射出finished()信號。finished()信號會攜帶退出碼和退出狀態,可以分別通過exitCode()和exitStatus()來獲得。
當發生錯誤時,QProcess會發出一個error()信號,同樣的,也可以通過error()來獲得其錯誤類型,通過state()獲得當前程序的狀態。
三、QProcess與QIODevice
QProcess繼承與QIODevice,因此,我們可以把它當作一個I/O設備進行讀寫操作。
四、交互
QProcess有兩種預定義的輸入通道:標准輸出stdout與標准錯誤stderr,它們本質上是兩個獨立的數據流,可以通過調用setReadChanned()函數設置當前的讀通道,在進程啟動以前以 MergedChannels 參數調用 setReadChannelMode() 函數可以把標准輸出通道和標准輸出錯誤通道合並。
當通道的數據准備就緒時,QProcess會發出readyRead()信號。如果是標准輸出,則發出readyReadStandardOutput()信號。如果是標准錯誤,則發出readyReadStandardError()信號。
常用的讀取方式有 read() ,readAll() 或 getChar(),也可以通過 readAllStandardOutput() 和 readAllStandardError() 讀取標准輸出和標准錯誤通道中的數據。
某些程序需要設置環境才能進行特殊的操作。可以通過 setEnvironment() 來設置環境變量,通過 setWorkingDirectory() 來設置工作目錄,默認的工作路徑是當前調用程序的工作路徑。
Qt定義了如下的進程錯誤代碼:
錯誤常量 值 描述
QProcess::FailedToStart 0 進程啟動失敗
QProcess::Crashed 1 進程成功后崩潰
QProcess::Timedout 2 最后一次調用waitFor...()函數超時。此時QProcess狀態不變,並可以再次調用waitFor...()類型的函數
QProcess::WriteError 3 向進程中寫入數據時出錯。如進程尚未啟動,或者輸入通道被關閉時。
QProcee::ReadError 4 從進程中讀取數據時出錯。如進程尚未啟動時
QProcess::UnknownError 5 未知錯誤。這也是error()函數返回的默認值。
五、同步API
QProcess提供了一系列的函數以提到事件循環來完成同步操作:
1)waitForStarted()//阻塞,直到外部程序啟動
2)waitForReadyRead()//阻塞,直到輸出通道中的新數據可讀
3) waitForBytesWritten()//阻塞,直到輸入通道中的數據被寫入
4) waitForFinished() //阻塞,直到外部程序結束
如果在主線程中調用這些函數,可能會造成當前用戶界面不響應。