利用函数qInstallMessageHandler
自定义消息处理函数原型
void QtMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
- Type
- QtDebugMsg 对应 qDebug
- QtWarningMsg 对应 qWarning
- QtCriticalMsg 对应 qCritical
- QtFatalMsg 对应 qFatal
- QtInfoMsg 对应 qInfo
- Context 保存了消息输出时的上下文信息,包括所处文件,所处行号,所处函数
- msg 是用户消息字符串。
当重定向之后,控制台或QT的输出窗口就不再显示信息了
取消重定向,使用qInstallMessageHandler(0)
在这个自定义的消息处理函数中编写输出方式,以及输出的附加内容
比如,利用Qfile可以把消息内容输出到文件,可作为日志
比如,利用fprintf(stderr,则把消息内容输出到控制台或QT的输出窗口
例如
void MyMessageOut(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
m_mutex.lock();
QByteArray localMsg = msg.toLocal8Bit();
QString strMsg("");
switch(type)
{
case QtDebugMsg:
strMsg = QString("Debug");
break;
case QtWarningMsg:
strMsg = QString("Warning");
break;
case QtCriticalMsg:
strMsg = QString("Critical");
break;
case QtFatalMsg:
strMsg = QString("Fatal");
break;
case QtInfoMsg:
strMsg = QString("Info");
break;
}
// 设置输出信息
QString message = QString("[%1]:{%2} File:%3 Line:%4 Function:%5 DateTime:%6")
.arg(strMsg).arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function)
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd")
);
// 输出至文件
QFile file(m_msgPath);
if(true == file.open(QIODevice::ReadWrite | QIODevice::Append))
{
QTextStream stream(&file);
stream << message << "\r\n";
file.flush();
file.close();
}
else// 未指定输出文件
{
// 转换到中文编码,用于控制台显示
QTextCodec *codec = QTextCodec::codecForName("GBK");
QByteArray encodedStr = codec->fromUnicode(message);
fprintf(stderr, "%s",encodedStr.data());
}
// 模仿qFatal
if(type == QtFatalMsg)
abort();
m_mutex.unlock();
}