QProcess
Qt提供了一個QProcess類用于啟動外部程序并與之通信.這個類是異步工作的,而且在后臺執行,這樣用戶界面就可以始終保持響應。
?啟動一個新的進程的操作非常簡單,只需要將待啟動的程序名稱和啟動參數傳遞給start()函數即可.
例如:
QObject *parent;QString program = "tar" QStringList arguments;arguments << "czvf" << "backup.tar.gz" << "/home";QProcess *myProcess = new QProcess(parent);QProcess->start(program, arguments);
(1)當調用start()函數后,myProcess進程立即進入啟動狀態,但tar程序尚未被調用,不能讀寫標準輸入輸出設備.
(2)當進程完成啟動后就進入"運行狀態"并向外發出started()信號.在輸入輸出方面,QProcess將一個進程看做一個流類型的I/O設備,可以像使用QTcpSocket讀寫流類型的網絡連接一樣來讀寫一個進程.可以通過QIODevice::write()函數向所啟動進程的標準輸入寫數據,也可以通過QIODevice::readAll()、QIODevice::readLine()和QIODevice::getChar()函數從這個進程的標準輸出讀數據.此外由于QProcess是從QIODevice類繼承而來的,因此,它也可以作為QXmlReader
的數據在源,或者為QFtp產生上傳數據.
(3)最后,當進程退出時QProcess進入起始狀態----"非運行狀態",并發出finished()信號.
???void finished(int exitCode, QProcess::ExitStatus exitStatus)信號在參數中返回了進程退出的退出碼和退出狀態,可以調用exitCode()函數和exitStatus()函數分別獲取最后退出進程的這兩個值.其中,Qt定義的進程"退出狀態"只有正常退出和進程崩潰兩種,分別對應值QProcess::NormalExit(值0)和QProcess::CrashExit(值1).當進程在運
行中產生錯誤時,QProcess將發出error()信號,可以通過,調用error()函數返回最后一次產生錯誤的類型,并通過,state()找出此時進程所處的狀態.
?
Qt定義了如下的進程錯誤代碼:
----------------------------------------------------------------
錯誤常量 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?值????? 描述
QProcess::FailedToStart??????? 0??????進程啟動失敗
QProcess::Crashed ? ? ? ? ? ? ? 1?????? 進程成功啟動后崩潰
QProcess::Timedout ? ? ? ? ? ? ?2?????? 最后一次調用waitFor...()函數超時.此時QProcess狀態不變,并可以再次調用waitFor()類型的函數
QProcess::WriteError ? ? ? ? ? ? 3?????? 向進程寫入時出錯.如進程尚未啟動,或者輸入通道被關閉時
QProcess::ReadError ? ? ? ? ? ? 4?????? 從進程中讀取數據時出錯.如進程尚未啟動時
QProcess::UnknownError ? ? ?5??????未知錯誤.這也是error()函數返回的默認值
?
進程的標準輸出:
stdout:通常用于控制臺下輸出
stderr:通常用于進程打印錯誤
它們本質上是兩個獨立的數據流.
可以通過調用setReadChanned()函數設置當前的讀通道
當有可讀數據時Qt將發發出readyRead()信號
如果是標準輸出和標準錯誤通道中讀取數據,還會發出readyReadStandardOutput()信號
如果是標準錯誤也會發出readyReadStandardError()信號
readAllStandardOutput()函數從標準輸出通道中讀取數據
readAllStandardErrot()函數從標準錯誤通道中讀取數據
在進程啟動以前以MergedChannels參數調用setReadChannelMode()函數可以把標準輸出通道和標準輸錯誤通道合并
例如:
#include <QApplication>
#include <QProcess>
#include <QString>
#include <iostream>int main(int argc, char *argv[])
{QApplication app(argc, argv);QProcess proc;QStringList arguments;arguments << "-na";proc.start("netstat", arguments);// 等待進程啟動if (!proc.waitForStarted()){std::cout << "啟動失敗\n";return false;}// 關閉寫通道,因為沒有向進程寫數據,沒用到 proc.closeWriteChannel();// 用于保存進程的控制臺輸出QByteArray procOutput;// 等待進程結束while (false == proc.waitForFinished()){;}// 讀取進程輸出到控制臺的數據procOutput = proc.readAll();// 輸出讀到的數據std::cout << procOutput.data() << std::endl;// 返回return EXIT_SUCCESS;
}