項目做到一定階段,常常須要在原來的project上調用外部程序。
Qt為此提供了QProcess類,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)
外部程序啟動后,當主程序退出時並不退出。而是繼續執行。
值得注意的是。當程序路徑中含有空格的時候,僅設置程序路徑program是無法被識別的。解決方法是再將程序路徑傳遞給arguments。
比如:
- //1-不帶空格。能夠啟動
- process->start("F:/AppInst/115/115com/115com.exe");
- //2-帶空格,無法啟動
- process->start("C:/Program Files/HaoZip/HaoZip.exe");
- //3-帶空格,使用帶參模式。能夠啟動
- process->start("C:/Program Files/HaoZip/HaoZip.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe"));
二、啟動之前須要做的工作:
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官方自帶的樣例:
- 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()已經整合了上面的三個步驟。假設須要分別設置,請採用以上的方式。
三、啟動狀態
外部程序未啟動時。其狀態是NotRunning;
當啟動時,其狀態轉變為Starting,正在啟動。但此時還未調用起來。
啟動之后,繼續變為Running,同一時候發射出started()信號,此時,能夠對QProcess進行讀寫操作了。
當退出時,其狀態改為NotRunning。並發射出finished()信號。finishe()信號會攜帶退出碼和退出狀態,能夠分別通過exitCode()和exitStatus()來獲得。
當錯誤發生時,QProcess會發出一個error()信號。相同的。也能夠通過error()來獲得其錯誤類型,通過state()獲得當前程序的狀態。
四、QProcess 與 QIODevice
QProcess繼承於QIODevice,因此。我們能夠把它當作是一個I/O設備進行讀寫操作。
五、交互
QProcess有兩種提前定義的輸出通道:標准輸出stdout與標准錯誤stderr。
通過setReadChannel()能夠選擇當前讀取輸出的通道。
當通道中的數據准備就緒時。QProcess會發出readyRead()信號。假設是標准輸出。則發出readyReadStandardOutput()信號。假設是標准錯誤,則發出readyReadStandardError()信號。
經常使用的讀取方式有read(), readAll()或getChar(),也能夠通過readAllStandardOutput()和readAllStandardError()讀取標准輸出和標准錯誤通道中的數據。
某些程序須要環境設置才干進行特殊的操作。能夠通過setEnvironment()來環境變量設置,通過setWorkingDirectory()來設置工作文件夾,默認的工作路徑是當前調用程序的工作路徑。
六、Synchronous Process API (同步進程API)
QProcess提供了一系列的函數以提到事件循環來完畢同步操作:
(1)waitForStarted() : 堵塞。直到外部程序啟動
(2)waitForReadyRead() : 堵塞,直到輸出通道中的新數據可讀
(3)waitForBytesWritten() : 堵塞,直到輸入通道中的數據被寫入
(4)waitForFinished() : 堵塞,直到外部程序結束
假設在主線程(QApplication::exec())中調用這些函數,可能會造成當前用戶界面不響應。
原文:https://www.cnblogs.com/mengfanrong/p/5341512.html
放一個ping IP地址是否可達的例子:
QString cmdstr = QString("ping -c 3 %1") .arg(QString::fromStdString("127.0.0.1")); QProcess cmd; cmd.start(cmdstr); cmd.waitForReadyRead(1000); cmd.waitForFinished(1000); QString response = cmd.readAll(); DebugLog(<<"qtping res:" << response.toStdString()); if (response.indexOf("ttl") != -1) { //可達 } else { //不可達 }