1. ホーム
  2. c++

[解決済み] qDebug, qWarning, qCriticalなどの出力をリダイレクトするには?

2023-02-07 23:10:55

質問

私は、たくさんの qDebug() << ステートメントを使用しています。シェルスクリプトに頼ることなく、デバッグ出力をファイルにリダイレクトできるクロスプラットフォームな方法はないでしょうか?私が推測しているのは open() dup2() は、Linuxで仕事をしますが、WindowsでMinGWでコンパイルされたものは動作するのでしょうか?

そして、多分、それをするためのQtの方法があります?

どのように解決するのですか?

メッセージハンドラのインストールは qInstallMsgHandler 関数を使用し、次に QTextStream を記述することで デバッグ メッセージをファイルに書き出すことができます。以下はそのサンプルです。

#include <QtGlobal>
#include <stdio.h>
#include <stdlib.h>

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    switch (type) {
    case QtDebugMsg:
        fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        abort();
    }
}

int main(int argc, char **argv)
{
    qInstallMessageHandler(myMessageOutput); // Install the handler
    QApplication app(argc, argv);
    ...
    return app.exec();
}

のドキュメントから引用した。 qInstallMsgHandler (のドキュメントから引用しました(私はコメントのみ追加しました)。

上記の例では、関数 myMessageOutputstderr を使っていますが、これは他のファイルストリームに置き換えるか、関数を完全に書き直した方が良いでしょう!

この関数を書いてインストールすると、あなたのすべての qDebug (と同じように qWarning , qCritical など) のメッセージは、ハンドラで書き込んだファイルにリダイレクトされるでしょう。