定義
The QProcess class is used to start external programs and to communicate with them.
QProcess類是用來啟動一個外部程式並與之通訊。 使用說明 開啟外部線程的3中方式
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.
Alternatively, you can set the program to run with setProgram() and setArguments(), and then call start() or open().
想要啟動一個進程,可以傳遞你想啟動的程式的名字和命令列參數作為參數傳遞給start()函數。參數作為QStringList中每一個單獨的字串。
或者,你可以通過setProgram()和setArguments()來設定該程式,然後調用start()或者open()啟動該程式。 啟動時在指定程式名時就附帶上參數
QProcess process;process.start("cmd /c ping 127.0.0.1");
啟動時分別指定函數名和參數列表
QProcess process;process.start("cmd", QStringList()<<"/c"<<"ping 127.0.0.1", QIODevice::ReadWrite);
分別指定函數名和參數,然後再啟動
QProcess process;process.setProgram("cmd");process.setArguments(QStringList()<<"/c"<<"ping 127.0.0.1");process.start(QIODevice::ReadWrite);
一次性讀取進程輸出
void readProcessAllOnce(bool processAutoExit) { qDebug()<<"readProcessAllOnce, processAutoExit ="<<processAutoExit; qDebug()<<"----------------------"; bool ret; QProcess process; QString command; if(processAutoExit) { command = "cmd /c ping 127.0.0.1"; } else { command = "cmd /k ping 127.0.0.1"; } process.start(command); /* * bool QProcess::waitForStarted(int msecs = 30000) */ ret = process.waitForStarted(); qDebug()<<"waitForStarted"<<ret; qDebug()<<QDateTime::currentDateTime(); /* * 如果開啟的不是自動關閉的進程,那麼這裡最多可能會等待30秒 * bool QProcess::waitForFinished(int msecs = 30000) */ ret = process.waitForFinished(); qDebug()<<QDateTime::currentDateTime(); qDebug()<<"waitForFinished"<<ret; QByteArray byteArray = process.readAllStandardOutput(); QString str = QString::fromLocal8Bit(byteArray); qDebug()<<str; process.close(); qDebug()<<""; qDebug()<<"======================";}
按行讀取進程輸出
void readProcessByLine() { qDebug()<<"readProcessByLine"; qDebug()<<"----------------------"; bool ret; QProcess process(0); /* * cmd /c 的命令執行完後會關閉視窗 * cmd /k 的命令執行完後不會關閉視窗 * * aa && bb 就是執行aa,成功後再執行bb * aa || bb 先執行aa,若執行成功則不再執行bb,若失敗則執行bb * a & b 表示執行a再執行b,而無論a是否成功 */ process.start("cmd", QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit", QIODevice::ReadWrite);// process.setProgram("cmd");// process.setArguments(QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit");// process.start(QIODevice::ReadWrite); ret = process.waitForStarted(); qDebug()<<"waitForStarted"<<ret; qint64 maxSize = 512; char buffer[maxSize]; qint64 len; while(true) { /* * 一個waitForReadyRead訊號可能輸出的是多行 */ ret = process.waitForReadyRead(); qDebug()<<"waitForReadyRead"<<ret; if(!ret) { break; } while(true) { len = process.readLine(buffer, maxSize); qDebug()<<"buffer len"<<len; /* * 因為每一行至少還有斷行符號分行符號,因此讀到0,說明waitForReadyRead逾時返回false */ if(len <= 0) { break; } QString str = QString::fromLocal8Bit(buffer); qDebug()<<"qstring len"<<str.length(); qDebug()<<str; qDebug()<<""; } } process.write("exit\r\n"); ret = process.waitForFinished(); qDebug()<<"waitForFinished"<<ret; process.close(); qDebug()<<""; qDebug()<<"======================";}
與進程互動
void openProcessThenWrite() { qDebug()<<"openProcessThenWrite"; qDebug()<<"----------------------"; bool ret; QProcess *process = new QProcess(QThread::currentThread()); /* * 如果沒有QCoreApplication的話,會報如下錯誤 * QObject::startTimer: Timers can only be used with threads started with QThread. timer只能在同一個線程中建立和啟動. */ process->start("cmd", QIODevice::ReadWrite); ret = process->waitForStarted(); qDebug()<<"waitForReadyRead"<<ret; QByteArray byteArray = process->readAllStandardOutput(); QString str = QString::fromLocal8Bit(byteArray); qDebug()<<str; //這裡不加換行的話命令發不出去 qint64 len = process->write("ping 127.0.0.1\r\nexit\r\n"); qDebug()<<"write len"<<len; while(true) { /* * 如果進程已經關閉,waitForReadyRead會直接返回false */ ret = process->waitForReadyRead(); qDebug()<<"waitForReadyRead"<<ret; if(!ret) { break; } byteArray = process->readAllStandardOutput(); str = QString::fromLocal8Bit(byteArray); qDebug()<<str; qDebug()<<""; } /* * 如果沒有關閉cmd的指令,因此該process永遠不會finished,會逾時(30秒)返回false */ ret = process->waitForFinished(); qDebug()<<"waitForFinished"<<ret; process->close(); delete process; qDebug()<<""; qDebug()<<"======================";}
測試函數
#include <QCoreApplication>#include <QDebug>#include <QProcess>#include <QThread>#include <QDateTime>void readProcessAllOnce(bool processAutoExit) { ……}void readProcessByLine() { ……}void openProcessThenWrite() { ……}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); qDebug()<<"======================"; readProcessAllOnce(false); readProcessAllOnce(true); readProcessByLine(); openProcessThenWrite(); qDebug()<<"That's all"; return a.exec();}