本篇主要介绍该加工软件的日志模块
实现的功能:
-
主界面日志栏显示
-
分级显示
-
本地保存
-
简单的调用机制
目前选择的是qInstallMessageHandler,毕竟是qt亲儿子(Qt 5.0以上版本) -
QMutex保证线程安全
-
消息的格式化,目前主要是debug与warning,主页面显示会做颜色区分
-
信号logMessageReceived,在每次捕获到日志消息时发出,暂时不需要异步调用槽
以下为该类主要代码
点击查看代码
static void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
Q_UNUSED(context)
CustomMessageHandler* handler = CustomMessageHandler::instance(); // 这是一个假设的方法,你需要自己实现它
if (handler) {
QMutexLocker locker(&handler->mutex);
QString logMessage;
QDateTime currentTime = QDateTime::currentDateTime();
QString formattedTime = currentTime.toString("yyyy-MM-dd HH:mm:ss ");
switch (type) {
case QtDebugMsg:
logMessage = QString("%1:%2").arg(formattedTime).arg(msg);
break;
case QtInfoMsg:
logMessage = QString("Info:%1").arg(msg);
break;
case QtWarningMsg:
logMessage = QString("%1 warning %2").arg(formattedTime).arg(msg);
break;
case QtCriticalMsg:
logMessage = QString("Critical: %1").arg(msg);
break;
case QtFatalMsg:
logMessage = QString("Fatal: %1").arg(msg);
abort(); // Or handle fatal messages as needed
break;
}
handler->logStream << logMessage << "\n";
handler->logStream.flush();
emit handler->logMessageReceived(logMessage);
}
}
界面显示设定
点击查看代码
// 使用互斥锁来避免在更新QTextEdit时的竞态条件
QMutexLocker locker(&textEditMutex);
bool contains = message.contains("warning");
if(contains)
{
QTextCharFormat redFormat;
redFormat.setForeground(Qt::red);
ui->textEdit_log->setCurrentCharFormat(redFormat);
}
else
{
QTextCharFormat blackFormat;
blackFormat.setForeground(Qt::black);
ui->textEdit_log->setCurrentCharFormat(blackFormat);
}
ui->textEdit_log->append(message);
主进程中写好信号与槽,并注册就可以运行了
最终效果: