qInstallMessageHandler来实现输出详细日志,输出文件名,行号,所在函数及事件,并写入文件。最后调用系统原来的函数,使信息像之前一样输出到调试窗口,便于开发。
QtMessageHandler gDefaultHandler = NULL;
//在其它地方调用qInstallMessageHandler设置新的输出函数,但保存原来的函数
gDefaultHandler = qInstallMessageHandler(myMessageOutput);
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QDateTime time = QDateTime::currentDateTime();
QString strTime = time.toString("MM-dd hh:mm:ss");
QString strMessage = QString("%1 File:%2 Line:%3 Function:%4\r\n %5")
.arg(strTime).arg(context.file).arg(context.line).arg(context.function).arg(msg);
QString strMsg("");
switch(type)
{
case QtDebugMsg:
strMsg = QString("Debug");
break;
case QtInfoMsg:
strMsg = QString("Info");
break;
case QtWarningMsg:
strMsg = QString("Warning:");
break;
case QtCriticalMsg:
strMsg = QString("Critical:");
break;
case QtFatalMsg:
strMsg = QString("Fatal:");
break;
default:
strMsg = QString("Err");
break;
}
strMessage = strMsg+strMessage;
// 加锁
static QMutex mutex;
mutex.lock();
// 输出信息至文件中(读写、追加形式)
QFile file("D:\\log.txt");
file.open(QIODevice::ReadWrite | QIODevice::Append);
QTextStream stream(&file);
stream << strMessage << "\r\n";
file.flush();
file.close();
// 解锁
mutex.unlock();
//用系统原来的函数完成原来的功能. 比如输出到调试窗
if(gDefaultHandler)
{
gDefaultHandler(type,context,msg);
}
}
上面代码里使用gDefaultHandler 保留了qInstallMessageHandler返回的系统原来的函数,最后再调用。这样qDebug()、qInfo()的信息和之前一样写入调试窗口,同时也写入了文件。
Release 版本默认不包含这些信息:文件名、函数名、行数,需要在项目文件加入以下代码,加入后最好重新构建项目使之生效:
DEFINES += QT_MESSAGELOGCONTEXT
手机扫一扫
移动阅读更方便
你可能感兴趣的文章