1,"qInstallMessageHandler"的原理,应该是“publisher-subscriber”(发布/订阅模式),通过该函数将自定义的log输出函数注册到Qt的框架中,替换Qt默认的将log输出到窗口函数。因此,可以设计成如下形式,在debug模式时,log输出到控制台,而release模式,log输出到文件。
#ifndef QT_DEBUG
g_OutputDebug.open(qPrintable(QString(QCoreApplication::applicationDirPath() + QString("/Log/log.txt"))),\
std::ios::out | std::ios::trunc);
qInstallMessageHandler(outputMessage); //注册MessageHandler
#endif // QT_DEBUG
2,自定义的log输出函数“outputMessage”注册到Qt后,是由Qt去调用的,就像Qt输出日志到控制台一样,它会自行处理多线程的问题,故在“outputMessage”函数中,无需加锁(已验证)。Qt帮助文档中的示例就没有加锁。
3,自定义的log输出函数“outputMessage”要求是全局或类的静态函数,不能是类的成员函数,STL的functor就不支持类的成员函数。
4,为了避免反复open/close文件,可以将文件定义为全局变量。在mainwindow的构造函数中进行资源绑定和注册,见上面的代码;在mainwindow的析构函数中,进行close。
关键代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "workthread.h"
#include
#include
std::ofstream g_OutputDebug;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::