2010-10-04 24 views
21

我以爲我會使用下面的代碼從一個QProcess中的輸出:如何從QProcess獲得STDOUT?

// Start the process 
process.start(tr("php-cgi www/test.php"),QIODevice::ReadWrite); 

// Wait for it to start 
if(!process.waitForStarted()) 
    return 0; 

// Continue reading the data until EOF reached 
QByteArray data; 

while(process.waitForReadyRead()) 
    data.append(process.readAll()); 

// Output the data 
qDebug(data.data()); 
qDebug("Done!"); 

什麼我期待就是看從印刷到調試控制檯程序的輸出,但我看到的是:

完成!

我知道:

  • 程序啓動罰款,因爲印在最後的消息。
  • 確實打印輸出,因爲運行在終端中的完全相同的命令產生文本的長字符串按預期的程序。

我在做什麼錯在這裏?

+3

是毫無意義的封閉可執行文件語言翻譯宏TR()。我也懷疑,把可執行文件和參數作爲第一個參數是可行的。更好:process.start(「php-cgi」,QStringList()<<「www/test.php」,QIODevice :: ReadWrite); – 2013-02-23 20:41:44

+0

如果您不想在QProcess運行時阻止您的應用程序,請查看此問題的答案: http://stackoverflow.com/questions/10098980/real-time-display-of-qprocess-output-in-a -textbrowser – parsley72 2014-01-25 06:14:45

+0

看一看接受的答案,這類似的問題:http://stackoverflow.com/questions/2148185/run-linux-command-line-commands-from-qt4/2148360#2148360 – Fred 2010-10-04 14:22:00

回答

22

befor開始您的通話過程:process.setProcessChannelMode(QProcess::MergedChannels);。它會導致打印一切(甚至標準輸出)到標準輸出。

5

下面是一些澄清:

根據http://doc.qt.io/qt-5/qprocess.html#ProcessChannelMode-enum

  • QProcess中:: MergedChannels:QProcess中合併運行過程的輸出到標準輸出信道(標準輸出)。 的標準誤差信道(錯誤)不會接收任何數據[...]

  • QProcess中:: ForwardedChannels:QProcess中轉發的運行過程的輸出進入主流程。 任何東西子進程寫入其標準輸出和標準錯誤將寫入主進程的標準輸出和標準錯誤