2010-10-04 10 views
21

ho pensato che stavo per ottenere l'uscita da un QProcess utilizzando il seguente codice:Come ottenere STDOUT da un 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!"); 

Quello che mi aspetto è quello di vedere l'uscita dal programma stampato per la console di debug, ma tutto quello che vedo è:

Fatto!

So che:

  • Il programma viene avviato bene, perché il messaggio alla fine viene stampato.
  • Il programma fa l'output di stampa perché l'esecuzione dello stesso esatto comando nel terminale produce una lunga stringa di testo come previsto.

Cosa sto facendo di sbagliato qui?

+3

Non è possibile racchiudere un file eseguibile con la macro di traduzione tr(). Dubito anche che il mettere parametro eseguibile e parametro come prima cosa funzionerebbe. Meglio: process.start ("php-cgi", QStringList() << "www/test.php", QIODevice :: ReadWrite); –

+0

Se non vuoi bloccare la tua app mentre QProcess gira guarda la risposta a questa domanda: http://stackoverflow.com/questions/10098980/real-time-display-of-qprocess-output-in-a -textbrowser – parsley72

+0

Dai un'occhiata alla risposta accettata a questa domanda simile: http://stackoverflow.com/questions/2148185/run-linux-command-line-commands-from-qt4/2148360#2148360 – Fred

risposta

22

prima di iniziare la chiamata di processo: process.setProcessChannelMode(QProcess::MergedChannels);. Ciò causerà la stampa di tutto (anche l'output di stderr) sull'output di stdout.

5

Ecco qualche chiarimento:

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

  • QProcess :: MergedChannels: QProcess fonde l'uscita del processo in esecuzione nel canale di uscita standard (stdout). Lo standard error canale (stderr) non si ricevere dati [...]

ma

  • QProcess :: ForwardedChannels:. QProcess inoltra l'uscita del processo in esecuzione sul processo principale. Qualsiasi oggetto il processo figlio scrive sul suo output standard e l'errore standard verrà scritto sull'output standard e l'errore standard del processo principale.
Problemi correlati