如果能将调试信息打印到文件,那软件发布到其他机器运行时,就可以记录软件运行的异常情况了。
查看手册,Qt 的QtMsgHandler qInstallMsgHandler ( QtMsgHandler handler )函数可以安装一个自定义的消息处理函数,自带的例子如下:
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
void myMessageOutput(QtMsgType type, const char *msg)
{
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s\n", msg);
abort();
}
}
int main(int argc, char **argv)
{
qInstallMsgHandler(myMessageOutput);
QApplication app(argc, argv);
...
return app.exec();
}
在这个例子的基础上,在myMessageOutput函数里加入将msg写入文件的代码就可以了。
以下是修改过代码:
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
void myMessageOutput(QtMsgType type, const char *msg)
{
QString txt;
QString tim = QDate::currentDate().toString("yyyyMMdd") + QTime::currentTime().toString("hhmmss") + QString("-");
switch (type) {
case QtDebugMsg: //调试信息提示
txt = tim + QString("Debug: %1\n").arg(msg);
break;
case QtWarningMsg: //一般的warning提示
txt = tim + QString("Warning: %1").arg(msg);
break;
case QtCriticalMsg: //严重错误提示
txt = tim + QString("Critical: %1").arg(msg);
break;
case QtFatalMsg: //致命错误提示
txt = tim + QString("Fatal: %1").arg(msg);
//abort();
}
QFile outFile("logFile.txt"); //写入文件
outFile.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream ts(&outFile);
ts << txt << "\r\n" << endl;
if(QtFatalMsg == type){
abort();
}
}
int main(int argc, char **argv)
{
qInstallMsgHandler(myMessageOutput);
QApplication app(argc, argv);
...
return app.exec();
}
在主函数里注册了myMessageOutput函数后,再使用qDebug函数,打印输出就全部被写入到logFile.txt里面了。