• Qt中利用QTextBrowser控件设计日志窗口


    我们一般使用Qt开发应用程序时,都有将控制台窗口去掉。但是,有时候又需要查看一些调试信息,一般的处理方式是把log写到一个文件中。本文介绍一下日志窗口,可以更方便的查看日志信息。

    UI设计

    推拽UI控件,修改默认背景。
    请添加图片描述

    日志打印接口

    目前仅支持三种操作,可根据需要扩展。

    /*
     * 文档操作方式
     */
    enum
    {
    	ADD_TYPE_NOLINE = 0,        // 不换行
    	ADD_TYPE_LINE,              // 换行
    	ADD_TYPE_REPLACE_LINE,      // 替换当前行
    };
    
    void ShowLogDlg::AppendLogMessage(const QString& msg, const QString& color, uint16_t optType)
    {
        // 格式化当前时间
        QDateTime dt = QDateTime::currentDateTime();
        QString strTime = dt.toString("yyyyMMdd HHmmss.zzz");
        QString ts = QString("[%1] ").arg(strTime);
        QString coloredMessage = QString("%2").arg(color).arg(msg);
    
        switch (optType)
        {
        case ADD_TYPE_NOLINE:
        {
            ui.browserLogText->moveCursor(QTextCursor::End);
            ui.browserLogText->insertHtml(coloredMessage);
        }
            break;
        case ADD_TYPE_LINE:
        {
            ui.browserLogText->append(ts + coloredMessage);
        }
            break;
        case ADD_TYPE_REPLACE_LINE:
        {
            // 获取当前的QTextCursor  
            QTextCursor cursor = ui.browserLogText->textCursor();
    
            // 检查是否有选中的文本或光标是否在有效位置  
            if (!cursor.hasSelection() && cursor.position() != -1) {
                // 定位到当前行的开始  
                cursor.movePosition(QTextCursor::StartOfLine);
                // 保存当前行的开始位置  
                int start = cursor.position();
    
                // 定位到当前行的结束(下一行的开始或文档末尾)  
                cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
                // 删除当前行  
                cursor.removeSelectedText();
    
                // 将修改后的cursor设置回QTextBrowser  
                ui.browserLogText->setTextCursor(cursor);
    
                // 设置新的行文本
                ui.browserLogText->insertHtml(ts + coloredMessage);
            }
        }
            break;
        default:
            break;
        }
    
        // Scroll to the end.
        QScrollBar* verticalScrollBar = ui.browserLogText->verticalScrollBar();
        verticalScrollBar->setValue(verticalScrollBar->maximum());
    }
    

    调试代码

    窗口显示时,模拟文件下载进度。

    void ShowLogDlg::showEvent(QShowEvent* event)
    {
        AppendLogMessage(QStringLiteral("开始下载文件"), "white", ADD_TYPE_LINE);
        AppendLogMessage(QStringLiteral("当前进度:......0%"), "white", ADD_TYPE_LINE);
        std::thread td([this]() {
            for (int i = 1; i <= 100; i++)
            {
                sleep(100);
                AppendLogMessage(QStringLiteral("当前进度:. . . . . . %1%").arg(i), "white", ADD_TYPE_REPLACE_LINE);
            }
    
            AppendLogMessage(QStringLiteral("下载完成"), "green", ADD_TYPE_LINE);
        });
        td.detach();
    
        __super::showEvent(event);
    }
    

    运行效果

    请添加图片描述

  • 相关阅读:
    为什么会产生yarn,解决了什么问题,优势?
    企业能源管控平台在工业能效提升行动中的作用
    dewarp:数据变换
    LeetCode 815. Bus Routes
    九方云学堂学员告诉你学习可以掌握哪些内容
    第二十五章·模板方法模式
    我的创作纪念日
    如何学习VBA:3.2.7 工作簿的操作引申
    shell脚本获取文件中的版权(Copyright)
    Spring Boot 2.x系列【14】功能篇之@Conditional注解
  • 原文地址:https://blog.csdn.net/ll_gg_tt/article/details/139742219