2010-10-04 17 views
21

Je pensais que j'allais obtenir la sortie d'un QProcess en utilisant le code suivant:Comment obtenir STDOUT à partir d'un processus Q?

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

Ce que je me attends est de voir la sortie du programme imprimé à la console de débogage, mais tout ce que je vois est:

Terminé!

Je sais que:

  • Le programme démarre très bien, parce que le message à la fin est imprimé.
  • Le programme exécute la sortie d'impression car l'exécution de la même commande dans le terminal produit une chaîne de texte longue comme prévu.

Qu'est-ce que je fais mal ici?

+3

Il n'est pas utile d'inclure un exécutable avec une macro de traduction de langue tr(). Je doute aussi, que mettre l'exécutable et le paramètre en tant que premier argument fonctionnerait. Mieux: process.start ("php-cgi", QStringList() << "www/test.php", QIODevice :: ReadWrite); –

+0

Si vous ne souhaitez pas bloquer votre application pendant que QProcess s'exécute, consultez la réponse à cette question: http://stackoverflow.com/questions/10098980/real-time-display-of-qprocess-output-in-a -textbrowser – parsley72

+0

Jetez un oeil à la réponse acceptée à cette question similaire: http://stackoverflow.com/questions/2148185/run-linux-command-line-commands-from-qt4/2148360#2148360 – Fred

Répondre

22

avant de commencer votre appel de processus: process.setProcessChannelMode(QProcess::MergedChannels);. Cela entraînera l'impression de tout (même la sortie stderr) vers la sortie stdout.

5

Voici quelques précisions:

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

  • QProcess :: MergedChannels: QProcess fusionne la sortie du processus en cours d'exécution dans le canal de sortie standard (stdout). Le canal d'erreur standard (stderr) ne sera pas recevoir des données [...]

mais

  • QProcess :: ForwardedChannels:. QProcess transmet la sortie du processus en cours sur le processus principal. Tout le processus enfant écrit dans sa sortie standard et l'erreur standard sera écrite dans la sortie standard et l'erreur standard du processus principal.