2010-10-04 3 views
21

Ich dachte, ich den Ausgang von einem QProcess mit dem folgenden Code bekommen werde:Wie bekomme ich STDOUT von einem QProcess?

// 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!"); 

Was ich erwarte, ist die Ausgabe von dem Programm in der Debug-Konsole gedruckt zu sehen, aber alles, was ich sehe, ist:

Fertig!

Ich weiß, dass:

  • Das Programm fein gestartet wird, weil die Nachricht am Ende gedruckt wird.
  • Das Programm tut Druckausgabe, da das Ausführen des genau gleichen Befehls in dem Terminal eine lange Zeichenfolge wie erwartet erzeugt.

Was mache ich hier falsch?

+3

Es gibt keinen Punkt einschließende ausführbare mit Sprachübersetzung Makro tr(). Ich bezweifle auch, dass das Ausführen von ausführbarem Programm und Parameter als erstes Argument funktionieren würde. Besser: process.start ("php-cgi", QStringList() << "www/test.php", QIODevice :: ReadWrite); –

+0

Wenn Sie Ihre App nicht blockieren möchten, während QProcess ausgeführt wird, sehen Sie sich die Antwort auf diese Frage an: http://stackoverflow.com/questions/10098980/real-time-display-of-qprocess-output-in-a- -textbrowser – parsley72

+0

Werfen Sie einen Blick auf die angenommene Antwort auf diese ähnliche Frage: http://stackoverflow.com/questions/2148185/run-linux-command-line-commands-from-qt4/2148360#2148360 – Fred

Antwort

22

bevor Sie Ihren Prozess aufrufen: process.setProcessChannelMode(QProcess::MergedChannels);. Dies bewirkt, dass alles (selbst die stderr-Ausgabe) ausgegeben wird. Hier

5

ist eine Klarstellung:

Nach http://doc.qt.io/qt-5/qprocess.html#ProcessChannelMode-enum,

  • QProcess :: MergedChannels: QProcess verbindet den Ausgang des laufenden Prozesses in die Standard-Ausgangskanal (stdout). Der Standardfehler Kanal (Stderr) werden keine Daten empfangen, [...]

aber

  • QProcess ForwardedChannels :::. QProcess leitet die Ausgabe des laufenden Prozesses auf den Hauptprozess. Alles der Kindprozess schreibt auf seine Standardausgabe und Standardfehler wird in die Standardausgabe und Standardfehler des Hauptprozesses geschrieben.