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

 更新时间:2024年06月21日 08:33:55   作者:ll_gg_tt  
本文主要介绍了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("<font color='gray'>[%1] </font>").arg(strTime);
    QString coloredMessage = QString("<font color='%1'>%2</font>").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);
}

运行效果

请添加图片描述

到此这篇关于Qt中利用QTextBrowser控件设计日志窗口的文章就介绍到这了,更多相关Qt中利用QTextBrowser控件设计日志窗口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C++获取多浏览器上网历史记录示例代码(支持获取IE/Chrome/FireFox)

    C++获取多浏览器上网历史记录示例代码(支持获取IE/Chrome/FireFox)

    这篇文章主要介绍了C++获取多浏览器上网历史记录示例代码,支持获取IE, Chrome,FireFox等浏览器
    2013-11-11
  • C++实现简单班级成绩管理系统

    C++实现简单班级成绩管理系统

    这篇文章主要为大家详细介绍了C++实现简单班级成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++实现Date类各种运算符重载的示例代码

    C++实现Date类各种运算符重载的示例代码

    这篇文章主要为大家详细介绍了C++实现Date类各种运算符重载的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • C语言预处理器使用方法讲解

    C语言预处理器使用方法讲解

    C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把C预处理器(C Preprocessor)简写为CPP
    2022-12-12
  • C++实现学生成绩管理系统最新版

    C++实现学生成绩管理系统最新版

    这篇文章主要为大家详细介绍了C++实现学生成绩管理系统最新版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++二叉树的前序中序后序非递归实现方法详细讲解

    C++二叉树的前序中序后序非递归实现方法详细讲解

    前序遍历的顺序是根、左、右。任何一颗树都可以认为分为左路节点,左路节点的右子树。先访问左路节点,再来访问左路节点的右子树。把访问左路节点的右子树看成一个子问题,就可以完整递归访问了
    2023-03-03
  • C语言超详细梳理排序算法的使用

    C语言超详细梳理排序算法的使用

    这篇文章主要介绍了C语言完成排序的实例,在C语言基本类型的排序中特别有用,下面我们一起进入文章学习更详细的内容吧,需要的朋友可以参考下
    2022-03-03
  • C++实现LeetCode(15.三数之和)

    C++实现LeetCode(15.三数之和)

    这篇文章主要介绍了C++实现LeetCode(三数之和),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • VSCode C++多文件编译的简单使用方法

    VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • boost.asio框架系列之调度器io_service

    boost.asio框架系列之调度器io_service

    这篇文章介绍了boost.asio框架系列之调度器io_service,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论