在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();
}