QProcess與外部程序的調用

    項目作到必定階段,常常須要在原來的工程上調用外部程序。Qt爲此提供了QProcess類,QProcess可用於完成啓動外部程序,並與之交互通訊。

1、啓動外部程序的兩種方式:
(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。
例如:
html


  1. //1-不帶空格,能夠啓動 併發

  2. process->start("F:/AppInst/115/115com/115com.exe");
    函數


  3. //2-帶空格,沒法啓動 spa

  4. process->start("C:/Program Files/HaoZip/HaoZip.exe");
    .net


  5. //3-帶空格,使用帶參模式,能夠啓動 線程

  6. process->start("C:/Program Files/HaoZip/HaoZip.exe"QStringList("C:/Program Files/HaoZip/HaoZip.exe")); htm


2、啓動以前須要作的工做:
    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官方自帶的例子:
blog

  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()已經整合了上面的三個步驟,若是須要分別設置,請採用以上的方式。

3、啓動狀態
    外部程序未啓動時,其狀態是NotRunning
    當啓動時,其狀態轉變爲Starting,正在啓動,但此時還未調用起來;
    啓動以後,繼續變爲Running,同時發射出started()信號,此時,能夠對QProcess進行讀寫操做了;
    當退出時,其狀態改成NotRunning,併發射出finished()信號。finishe()信號會攜帶退出碼和退出狀態,能夠分別經過exitCode()和exitStatus()來得到。
    當發生錯誤時,QProcess會發出一個error()信號,一樣的,也能夠經過error()來得到其錯誤類型,經過state()得到當前程序的狀態。

4、QProcess 與 QIODevice
    QProcess繼承於QIODevice,所以,咱們能夠把它看成是一個I/O設備進行讀寫操做。

5、交互
    QProcess有兩種預約義的輸出通道:標準輸出stdout與標準錯誤stderr。
    經過setReadChannel()能夠選擇當前讀取輸出的通道。
    當通道中的數據準備就緒時,QProcess會發出readyRead()信號。若是是標準輸出,則發出readyReadStandardOutput()信號;若是是標準錯誤,則發出readyReadStandardError()信號。
    經常使用的讀取方式有read(), readAll()或getChar(),也能夠經過readAllStandardOutput()和readAllStandardError()讀取標準輸出和標準錯誤通道中的數據。

    某些程序須要環境設置才能進行特殊的操做。能夠經過setEnvironment()來設置環境變量,經過setWorkingDirectory()來設置工做目錄,默認的工做路徑是當前調用程序的工做路徑。

6、Synchronous Process API (同步進程API)
    QProcess提供了一系列的函數以提到事件循環來完成同步操做:
(1)waitForStarted()          : 阻塞,直到外部程序啓動
(2)waitForReadyRead()    : 阻塞,直到輸出通道中的新數據可讀
(3)waitForBytesWritten()  : 阻塞,直到輸入通道中的數據被寫入
(4)waitForFinished()        : 阻塞,直到外部程序結束
    若是在主線程(QApplication::exec())中調用這些函數,可能會形成當前用戶界面不響應。

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


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


個人CSDN博客:http://blog.csdn.net/jan5_reyn

相關文章
相關標籤/搜索