QProcess與外部程序的調用


項目做到一定階段,常常須要在原來的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. //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())中調用這些函數,可能會造成當前用戶界面不響應。

原文: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
        {
           //不可達
        }

 


免責聲明!

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



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