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

    运行效果

    请添加图片描述

  • 相关阅读:
    关于游戏介绍的HTML网页设计 HTML5期末考核大作业 HTML静态游戏网页作业 web前端开发技术 web课程设计 网页规划与设计
    添加路由的2种方式--router
    Proxy代理配置解析
    参考开源项目实现一个简易的C++枚举转字符串的函数
    利用Font Awesome图标库为自己的网站页面添加矢量图标
    一文搞定Linux信号
    5月13号作业
    构建数字孪生微电网,实现能源系统一体化管控
    openstack计算节点的虚机部署安装
    融合注意力机制和Bi-LSTM的旅游评价情感分析模型
  • 原文地址:https://blog.csdn.net/ll_gg_tt/article/details/139742219