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

2024-06-21 06:36

本文主要是介绍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控件设计日志窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080469

相关文章

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

JAVA Log 日志级别和使用配置示例

《JAVALog日志级别和使用配置示例》本文介绍了Java中主流的日志框架,包括Logback和Log4j2,并详细解释了日志级别及其使用场景,同时,还提供了配置示例和使用技巧,如正确的日志记录方... 目录一、主流日志框架1. Logback (推荐)2. Log4j23. SLF4J + Logback

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

tomcat日志中文乱码问题及解决方案

《tomcat日志中文乱码问题及解决方案》文章主要介绍了在使用Tomcat时遇到的乱码问题及其解决方法,页面输出乱码可能由于server.xml配置、HTML标签、编程输出编码不一致引起,解决方法包括... 目录一、页面输出乱码1.server.XML配置未注明编码格式2.catalina.bawww.cp

Qt实现删除布局与布局切换功能

《Qt实现删除布局与布局切换功能》在Qt应用开发中,动态管理布局是一个常见需求,比如根据用户操作动态删除某个布局,或在不同布局间进行切换,本文将详细介绍如何实现这些功能,并通过完整示例展示具体操作,需... 目录一、Qt动态删除布局1. 布局删除的注意事项2. 动态删除布局的实现步骤示例:删除vboxLay

Mysql利用binlog日志恢复数据实战案例

《Mysql利用binlog日志恢复数据实战案例》在MySQL中使用二进制日志(binlog)恢复数据是一种常见的用于故障恢复或数据找回的方法,:本文主要介绍Mysql利用binlog日志恢复数据... 目录mysql binlog核心配置解析查看binlog日志核心配置项binlog核心配置说明查看当前所

Java 日志中 Marker 的使用示例详解

《Java日志中Marker的使用示例详解》Marker是SLF4J(以及Logback、Log4j2)提供的一个接口,它本质上是一个命名对象,你可以把它想象成一个可以附加到日志语句上的标签或戳... 目录什么是Marker?为什么使用Markejavascriptr?1. 精细化的过滤2. 触发特定操作3

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日