Qt全局函数qInstallMsgHandler安装消息句柄,实现日志输出

5 篇文章 0 订阅
在Qt源码qglobal.h文件中有如下全局函数:
void qWarning(const char * msg, ... )  //警告信息
void qCritical(const char * msg, ... //危险信息
void qDebug(const char * msg, ... )  //调试信息
void qFatal(const char * msg, ... //致命信息
QtMsgHandler qInstallMsgHandler(QtMsgHandler handler)  //安装消息回调句柄

Qt源码qglobal.cpp实现:
//告警日志
void qWarning(const char *msg, ...)
{
    va_list ap;
    va_start(ap, msg); // use variable arg list
    qt_message(QtWarningMsg, msg, ap);
    va_end(ap);
}

//日志内容转成QByteArray类型
static void qt_message(QtMsgType msgType, const char *msg, va_list ap)
{
#if !defined(QT_NO_EXCEPTIONS)
    if (std::uncaught_exception()) {
        qEmergencyOut(msgType, msg, ap);
        return;
    }
#endif
    QByteArray buf;
    if (msg) {
        QT_TRY {
            buf = QString().vsprintf(msg, ap).toLocal8Bit();
        } QT_CATCH(const std::bad_alloc &) {
#if !defined(QT_NO_EXCEPTIONS)
            qEmergencyOut(msgType, msg, ap);
            // don't rethrow - we use qWarning and friends in destructors.
            return;
#endif
        }
    }
    qt_message_output(msgType, buf.constData());
}

//调用回调函数处理日志信息
void qt_message_output(QtMsgType msgType, const char *buf)
{
    if (handler) {
        (*handler)(msgType, buf); //调用设置的回调函数处理
    } else {
       ...//其它的输出处理
    }
}


如果我们在程序中设置了消息的回调句柄,调用qWarning、 qWarning 、  qDebug 、  qFatal 函数就会回调到自定义的消息函数处理日志。

案例:
1、自定义了一个LogOutPut日志回调函数
2、在主程序里调用qInstallMsgHandler安装消息回调函数句柄
3、在程序里调用了qWarning、 qWarning 、 qDebug 、 qFatal 全局函数
会检测回调句柄,不为空则调用消息回调函数
#include <QtDebug>
#include <QFile>
#include <QTextStream>

#define _TIME_ 
qPrintable(QTime::currentTime ().toString ("hh:mm:ss:zzz"))

void LogOutPut(QtMsgType type, const char* msg)
{
    QString qstrText;
    switch (type)
    {
    case QtDebugMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtWarningMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtCriticalMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtFatalMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        exit(0);
    }
    QFile out("log.txt");
    out.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream ts(&out);
    ts<<qstrText<<endl;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qInstallMsgHandler(LogOutPut);

    qDebug("this is a debug message");
    qWarning("this is a warning message");
    qCritical("this is a critical message");
    qFatal("this is a fatal message");
    return a.exec();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值