为了账号安全,请及时绑定邮箱和手机立即绑定

如何重定向qDebug,qWarning,qCritical等输出?

如何重定向qDebug,qWarning,qCritical等输出?

C++
红糖糍粑 2019-10-28 14:18:22
我在qDebug() <<调试输出中使用了很多语句。有什么跨平台的方法可以将调试输出重定向到文件,而无需使用Shell脚本?我猜想open()和dup2()将在Linux中完成这项工作,但可以在Windows中与MinGW一起编译吗?也许有Qt方法可以做到?
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您必须使用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(我仅添加了评论)的文档:


QtMsgHandler qInstallMessageHandler(QtMsgHandler处理程序)

在上面的示例中,该函数myMessageOutput使用stderr了您可能希望用其他文件流替换的函数,或者完全重写了该函数!


一旦你写并安装此功能,您所有的qDebug(以及qWarning,qCritical等)消息将被重定向到你在处理程序写入文件。


查看完整回答
反对 回复 2019-10-28
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

从这里开始,所有的荣誉都归于精神。


#include <QApplication>

#include <QtDebug>

#include <QFile>

#include <QTextStream>


void myMessageHandler(QtMsgType type, const QMessageLogContext &, const QString & msg)

{

    QString txt;

    switch (type) {

    case QtDebugMsg:

        txt = QString("Debug: %1").arg(msg);

        break;

    case QtWarningMsg:

        txt = QString("Warning: %1").arg(msg);

    break;

    case QtCriticalMsg:

        txt = QString("Critical: %1").arg(msg);

    break;

    case QtFatalMsg:

        txt = QString("Fatal: %1").arg(msg);

    break;

    }

    QFile outFile("log");

    outFile.open(QIODevice::WriteOnly | QIODevice::Append);

    QTextStream ts(&outFile);

    ts << txt << endl;

}


int main( int argc, char * argv[] )

{

    QApplication app( argc, argv );

    qInstallMessageHandler(myMessageHandler);   

    ...

    return app.exec();

}


查看完整回答
反对 回复 2019-10-28
?
四季花海

TA贡献1811条经验 获得超5个赞

这是一个挂钩默认消息处理程序的工作示例。


谢谢@Ross Rogers!


// -- main.cpp


// Get the default Qt message handler.

static const QtMessageHandler QT_DEFAULT_MESSAGE_HANDLER = qInstallMessageHandler(0);


void myCustomMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)

{

    // Handle the messages!


    // Call the default handler.

    (*QT_DEFAULT_MESSAGE_HANDLER)(type, context, msg);

}


int main(int argc, char *argv[])

{

    qInstallMessageHandler(myCustomMessageHandler);


    QApplication a(argc, argv);


    qDebug() << "Wello Horld!";


    return 0;

}


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 897 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信