• 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);
    }
    

    运行效果

    请添加图片描述

  • 相关阅读:
    10.VueCLI和Vite
    CentOS Linux 的安装
    ADC测试杂谈二:matlab操作串口向FPGA发信
    idea svn创建trunk主干、branch分支和tag标签
    Leetcode 213. 打家劫舍 II 动态规划
    Web Worker
    Java对象创建流程 —— 个人学习记录
    两表查询常用SQL
    钓鱼识别视频AI算法,让智慧水务更上一层楼
    python练习:赋值运算 => 输入身高,体重,求BMI = 体重(kg)/身高(m)的平方。
  • 原文地址:https://blog.csdn.net/ll_gg_tt/article/details/139742219