Qt QDebug等重定向到文件中
2016-04-07 14:54
381 查看
源地址:http://blog.163.com/soyo_gogogo/blog/static/171414077201392705639321/
Qt的qDebug()等函数,可以打印出十分细致的log,用过你就会喜欢。现在要将qDebug()等重定向到文件中。
使用Qt的MessageHandler可以将消息重定向。在Qt4.x时代,安装一个消息处理器是用
qInstallMsgHandler
来安装的。这个函数接受的一个函数指针作为参数,函数的定义是
voidfunName(QtMsgType,constchar*)
如笔者的一个小函数:
logFile是一个全局的QFile类指针。
今天笔者使用Qt5.1版本来编写程序。该函数编译不通过。因为Qt5.x后,这个函数被
qInstallMessageHandler
替代了。这个函数同样接受一个函数指针作为参数,函数的定义是
voidfunName(QtMsgType,QMessageLogContext,constQString&)
可见,该函数中多了一个QMessageLogContext参数。这个参数包含了debug的一些基本信息,例如该debug所在的函数,所在的文件,所在的行数等。可以让debug更加详细。
笔者的一段小代码
可以见到在最后面做了一些格式化的东西。这样,debug看起来就是这样的
至于重定向到哪里,就看你的QFile打开的是哪个文件了。
这样处理格式其实还不是那么优雅。像第一个函数那样,没有做任何格式化的操作,因为笔者在另外一个文件中做了格式化。
这个文件被命名为log.h。这样,需要用到QDebug的地方,都可以#include"log.h"。
相信大家都明白了。
EnjoyyourQt.
Qt的qDebug()等函数,可以打印出十分细致的log,用过你就会喜欢。现在要将qDebug()等重定向到文件中。
使用Qt的MessageHandler可以将消息重定向。在Qt4.x时代,安装一个消息处理器是用
qInstallMsgHandler
来安装的。这个函数接受的一个函数指针作为参数,函数的定义是
voidfunName(QtMsgType,constchar*)
如笔者的一个小函数:
voidmessageOutput(QtMsgType,constchar*msg)
{
staticQMutexmutex;
mutex.lock();
logFile->write(msg);
logFile->write("\n");
logFile->flush();
mutex.unlock();
}
//Installit
qInstallMsgHandler(messageOutput);
logFile是一个全局的QFile类指针。
今天笔者使用Qt5.1版本来编写程序。该函数编译不通过。因为Qt5.x后,这个函数被
qInstallMessageHandler
替代了。这个函数同样接受一个函数指针作为参数,函数的定义是
voidfunName(QtMsgType,QMessageLogContext,constQString&)
可见,该函数中多了一个QMessageLogContext参数。这个参数包含了debug的一些基本信息,例如该debug所在的函数,所在的文件,所在的行数等。可以让debug更加详细。
笔者的一段小代码
voidMessageOutput(QtMsgTypetype,constQMessageLogContext&context,constQString&msg)
{
staticQMutexmutex;
mutex.lock();
QStringlog;
switch(type)
{
caseQtDebugMsg:
log=QString("Debug:");
break;
caseQtWarningMsg:
log=QString("Error:");
break;
caseQtCriticalMsg:
log=QString("CriticalError:");
break;
caseQtFatalMsg:
log=QString("FatalError:");
abort();
break;
default:
log=QString("UnknowMsgType:");
break;
};
log+=QTime::currentTime().toString("hh:mm:ss.zzz,File:")+QString(context.file);
log+=QString(",Line:")+QString::number(context.line)+QString(":%1\n").arg(msg);
logFile->write(log.toStdString().c_str());
logFile->flush();
mutex.unlock();
}
可以见到在最后面做了一些格式化的东西。这样,debug看起来就是这样的
至于重定向到哪里,就看你的QFile打开的是哪个文件了。
这样处理格式其实还不是那么优雅。像第一个函数那样,没有做任何格式化的操作,因为笔者在另外一个文件中做了格式化。
这个文件被命名为log.h。这样,需要用到QDebug的地方,都可以#include"log.h"。
相信大家都明白了。
EnjoyyourQt.
相关文章推荐
- qt执行cmd命令
- QT中QProcess调用命令行的痛苦经历
- Qt之开机自启动及拥有管理员权限
- Qt录音程序
- Qt多工程多目录的编译案例
- Qt 示例学习--1. enginio qml todos
- QT工程pro设置实践(with QtCreator)----非弄的像VS一样才顺手?
- PyQt4进度条QProgressBar
- Qt 多线程与数据库操作需要注意的几点问题
- 将Qt 动态链接生成的exe及依赖dll打包方法
- Qt之VLFeat SLIC超像素分割(Cpp版)
- opencv环境在QT的配置
- QT中QPainter的使用及矩形、圆形等常见图形的画法
- PyQt4滑块QSlider、标签QLabel
- QT 多线程小结
- qt 信号槽默认参数 toggled 和 trigger的区别
- 环境配置:Qt5.5+VS2013+OpenCv3.1.0+Win7(64bit)
- ros下qt creator环境搭建
- QTimer
- 关于qt的集成开发环境