web-dev-qa-db-ja.com

QProcessからSTDOUTを取得する方法は?

次のコードを使用して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!");

私が期待しているのは、デバッグコンソールに出力されたプログラムからの出力を表示することですが、表示されるのは次のとおりです。

できた!

そんなこと知ってる:

  • 最後のメッセージが表示されるので、プログラムは正常に起動します。
  • ターミナルでまったく同じコマンドを実行すると予想どおり長いテキスト文字列が生成されるため、プログラムdoesは出力を印刷します。

ここで何が悪いのですか?

24
Nathan Osman

プロセス呼び出しを開始する前に:

process.setProcessChannelMode(QProcess::MergedChannels);

これにより、すべて(STDERR出力を含む)がSTDOUT出力に出力されます。

28
Kamil Klimek

ここにいくつかの説明があります:

http://doc.qt.io/qt-5/qprocess.html#ProcessChannelMode-enum によれば、

  • QProcess::MergedChannelsQProcessは、実行中のプロセスの出力を標準出力チャネル(stdout)にマージします。 標準エラーチャネル(stderr)はデータを受信しません。[ ...]

しかし

  • QProcess::ForwardedChannelsQProcessは、実行中のプロセスの出力をメインプロセスに転送します。 Anything子プロセスが標準出力に書き込み、標準エラーが標準出力と標準エラーに書き込まれますメインプロセス。
10
Michel L