QProcess與外部程序的調用(可以通過設置管道來交互)


項目做到一定階段,經常需要在原來的工程上調用外部程序。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. //1-不帶空格,可以啟動
  2. process->start("F:/AppInst/115/115com/115com.exe");
  3. //2-帶空格,無法啟動
  4. process->start("C:/Program Files/HaoZip/HaoZip.exe");
  5. //3-帶空格,使用帶參模式,可以啟動
  6. 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官方自帶的例子:

  1. QObject *parent;
  2. ...
  3. QString program = "./path/to/Qt/examples/widgets/analogclock";
  4. QStringList arguments;
  5. arguments << "-style" << "fusion";
  6. QProcess *myProcess = new QProcess(parent);
  7. 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())中調用這些函數,可能會造成當前用戶界面不響應。

七、主要API
請參考Qt的官方說明:QProcess Class

PS:參考鏈接
從QProcess說開來(一) 
從QProcess說開來(二)

我的CSDN博客:http://blog.csdn.net/jan5_reyn

http://www.quweiji.com/qprocess%E4%B8%8E%E5%A4%96%E9%83%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%B0%83%E7%94%A8/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM