程序日志输出是程序调试中不可缺少的一部分,使用Qt中的QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)就可以将日志信息输出至自己想要的位置。
当有日志输出时,触发自定义的日志发送信号,此时接收该信号,即可将日志输出传递到任意位置,由于日志处理函数为静态函数,因此需要一个指针指向this,用于在静态函数中发送该信号。程序截图:

logwidget.h:
private:
Ui::LogWidget *ui;
static LogWidget* _pt;//静态指针,指向this,用于在静态函数中发送信号
static bool outputToFile;//控制重定向方式
static void myLogOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);//日志重定向静态函数
const QtMessageHandler messageHandler = qInstallMessageHandler(nullptr);//输出至编译器中的messageHandle
signals:
void logOutputed(QString log);
logwidget.cpp:
LogWidget* LogWidget::_pt = nullptr;//指针的初始化
bool LogWidget::outputToFile = false;
LogWidget::LogWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::LogWidget)
{
ui->setupUi(this);
_pt = this;//将指针指向 this
connect(this,SIGNAL(logOutputed(QString)),this,SLOT(showLog(QString)));//连接重定向信号
qInstallMessageHandler(LogWidget::myLogOutput);//注册重定向函数
}
LogWidget::~LogWidget()
{
delete ui;
}
void LogWidget::myLogOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString textTypeStr;
switch (type) {
case QtDebugMsg:
textTypeStr = "<<Debug>>";
break;
case QtInfoMsg:
textTypeStr = "<<Info>>";
break;
case QtWarningMsg:
textTypeStr = "<<Warning>>";
break;
case QtCriticalMsg:
textTypeStr = "<<Critical>>";
break;
case QtFatalMsg:
textTypeStr = "<<Fatal>>";
break;
}
// QString context_info = QString("FILE:(%1) Line:(%2)").arg(QString(context.file),QString(context.line));
QString current_data_time = QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss]");
QString message = current_data_time+" "+textTypeStr+" "+" "+msg;
if(outputToFile){//日志输出到文件
QString LogName = "Log.txt";
QFile file(LogName);
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream stream(&file);
stream.setCodec("UTF-8");
stream<<message<<"\r\n";
file.close();
}else{//发送日志信号
emit _pt->logOutputed(message);
}
mutex.unlock();
}
本文介绍了如何使用Qt的qInstallMessageHandler函数实现日志重定向,通过设置静态指针和自定义日志输出函数,可以将程序日志发送到指定位置,如控制台、文件或其他自定义接收器。示例代码展示了如何将日志信息输出到文件,并在需要时触发信号进行日志显示。
https://github.com/zjgo007/QtDemo/tree/master/LogTest

1万+

被折叠的 条评论
为什么被折叠?



