• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

智多星有用

激光马仔
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

qt激光加工软件开发——日志模块

本篇主要介绍该加工软件的日志模块
实现的功能:

  • 主界面日志栏显示

  • 分级显示

  • 本地保存

  • 简单的调用机制
    目前选择的是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);

主进程中写好信号与槽,并注册就可以运行了

最终效果:

posted on 2024-12-12 17:16  代码的无意义  阅读(151)  评论(2)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3