QT输入输出(四)之 QProcess
QProcess
Qt提供了一個(gè)QProcess類用于啟動(dòng)外部程序并與之通信.這個(gè)類是異步工作的,而且在后臺(tái)執(zhí)行,這樣用戶界面就可以始終保持響應(yīng)。
?啟動(dòng)一個(gè)新的進(jìn)程的操作非常簡(jiǎn)單,只需要將待啟動(dòng)的程序名稱和啟動(dòng)參數(shù)傳遞給start()函數(shù)即可.
例如:
QObject *parent;QString program = "tar" QStringList arguments;arguments << "czvf" << "backup.tar.gz" << "/home";QProcess *myProcess = new QProcess(parent);QProcess->start(program, arguments);
(1)當(dāng)調(diào)用start()函數(shù)后,myProcess進(jìn)程立即進(jìn)入啟動(dòng)狀態(tài),但tar程序尚未被調(diào)用,不能讀寫標(biāo)準(zhǔn)輸入輸出設(shè)備.
(2)當(dāng)進(jìn)程完成啟動(dòng)后就進(jìn)入"運(yùn)行狀態(tài)"并向外發(fā)出started()信號(hào).在輸入輸出方面,QProcess將一個(gè)進(jìn)程看做一個(gè)流類型的I/O設(shè)備,可以像使用QTcpSocket讀寫流類型的網(wǎng)絡(luò)連接一樣來讀寫一個(gè)進(jìn)程.可以通過QIODevice::write()函數(shù)向所啟動(dòng)進(jìn)程的標(biāo)準(zhǔn)輸入寫數(shù)據(jù),也可以通過QIODevice::readAll()、QIODevice::readLine()和QIODevice::getChar()函數(shù)從這個(gè)進(jìn)程的標(biāo)準(zhǔn)輸出讀數(shù)據(jù).此外由于QProcess是從QIODevice類繼承而來的,因此,它也可以作為QXmlReader
的數(shù)據(jù)在源,或者為QFtp產(chǎn)生上傳數(shù)據(jù).
(3)最后,當(dāng)進(jìn)程退出時(shí)QProcess進(jìn)入起始狀態(tài)----"非運(yùn)行狀態(tài)",并發(fā)出finished()信號(hào).
???void finished(int exitCode, QProcess::ExitStatus exitStatus)信號(hào)在參數(shù)中返回了進(jìn)程退出的退出碼和退出狀態(tài),可以調(diào)用exitCode()函數(shù)和exitStatus()函數(shù)分別獲取最后退出進(jìn)程的這兩個(gè)值.其中,Qt定義的進(jìn)程"退出狀態(tài)"只有正常退出和進(jìn)程崩潰兩種,分別對(duì)應(yīng)值QProcess::NormalExit(值0)和QProcess::CrashExit(值1).當(dāng)進(jìn)程在運(yùn)
行中產(chǎn)生錯(cuò)誤時(shí),QProcess將發(fā)出error()信號(hào),可以通過,調(diào)用error()函數(shù)返回最后一次產(chǎn)生錯(cuò)誤的類型,并通過,state()找出此時(shí)進(jìn)程所處的狀態(tài).
?
Qt定義了如下的進(jìn)程錯(cuò)誤代碼:
----------------------------------------------------------------
錯(cuò)誤常量 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?值????? 描述
QProcess::FailedToStart??????? 0??????進(jìn)程啟動(dòng)失敗
QProcess::Crashed ? ? ? ? ? ? ? 1?????? 進(jìn)程成功啟動(dòng)后崩潰
QProcess::Timedout ? ? ? ? ? ? ?2?????? 最后一次調(diào)用waitFor...()函數(shù)超時(shí).此時(shí)QProcess狀態(tài)不變,并可以再次調(diào)用waitFor()類型的函數(shù)
QProcess::WriteError ? ? ? ? ? ? 3?????? 向進(jìn)程寫入時(shí)出錯(cuò).如進(jìn)程尚未啟動(dòng),或者輸入通道被關(guān)閉時(shí)
QProcess::ReadError ? ? ? ? ? ? 4?????? 從進(jìn)程中讀取數(shù)據(jù)時(shí)出錯(cuò).如進(jìn)程尚未啟動(dòng)時(shí)
QProcess::UnknownError ? ? ?5??????未知錯(cuò)誤.這也是error()函數(shù)返回的默認(rèn)值
?
進(jìn)程的標(biāo)準(zhǔn)輸出:
stdout:通常用于控制臺(tái)下輸出
stderr:通常用于進(jìn)程打印錯(cuò)誤
它們本質(zhì)上是兩個(gè)獨(dú)立的數(shù)據(jù)流.
可以通過調(diào)用setReadChanned()函數(shù)設(shè)置當(dāng)前的讀通道
當(dāng)有可讀數(shù)據(jù)時(shí)Qt將發(fā)發(fā)出readyRead()信號(hào)
如果是標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤通道中讀取數(shù)據(jù),還會(huì)發(fā)出readyReadStandardOutput()信號(hào)
如果是標(biāo)準(zhǔn)錯(cuò)誤也會(huì)發(fā)出readyReadStandardError()信號(hào)
readAllStandardOutput()函數(shù)從標(biāo)準(zhǔn)輸出通道中讀取數(shù)據(jù)
readAllStandardErrot()函數(shù)從標(biāo)準(zhǔn)錯(cuò)誤通道中讀取數(shù)據(jù)
在進(jìn)程啟動(dòng)以前以MergedChannels參數(shù)調(diào)用setReadChannelMode()函數(shù)可以把標(biāo)準(zhǔn)輸出通道和標(biāo)準(zhǔn)輸錯(cuò)誤通道合并
例如:
#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);// 等待進(jìn)程啟動(dòng)if (!proc.waitForStarted()){std::cout << "啟動(dòng)失敗\n";return false;}// 關(guān)閉寫通道,因?yàn)闆]有向進(jìn)程寫數(shù)據(jù),沒用到 proc.closeWriteChannel();// 用于保存進(jìn)程的控制臺(tái)輸出QByteArray procOutput;// 等待進(jìn)程結(jié)束while (false == proc.waitForFinished()){;}// 讀取進(jìn)程輸出到控制臺(tái)的數(shù)據(jù)procOutput = proc.readAll();// 輸出讀到的數(shù)據(jù)std::cout << procOutput.data() << std::endl;// 返回return EXIT_SUCCESS; }總結(jié)
以上是生活随笔為你收集整理的QT输入输出(四)之 QProcess的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络层:IP协议详解(IP协议真的得看这
- 下一篇: C++ cout的使用,看这一篇就够了