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

运行效果

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg+SDL2实现音视频播放器项目

一、FFmpeg视频解码器 1.视频解码知识 1).纯净的视频解码流程 压缩编码数据->像素数据。 例如解码H.264&#xff0c;就是“H.264码流->YUV”。 2).一般的视频解码流程 视频码流一般存储在一定的封装格式&#xff08;例如MP4、AVI等&#xff09;中。封装格式中通常还…

反转链表(java精简版)

反转一个单向链表。 public class ReversingLinkedList {static class Node {int val;Node next;public Node(int val) {this.val val;}public boolean hasNext() {return next ! null;}}public static void main(String[] args) {//构造Node head null;Node shift null;for…

高效电商数据分析:电商爬虫API与大数据技术的融合应用

一、引言 随着电子商务的迅猛发展和数据量的爆炸式增长&#xff0c;电商数据分析已成为企业决策的关键依据。在竞争激烈的电商市场中&#xff0c;如何高效、准确地获取并分析数据&#xff0c;以洞察市场趋势、优化运营策略、提升用户体验&#xff0c;成为电商企业面临的重要挑…

期货止损口诀需牢记

实战操作难免错&#xff0c;心中不必一团火&#xff1b; 出错认输是常事&#xff0c;亏损不止闯大祸。 止损纪律要定死&#xff0c;价格不能差豪丝&#xff1b; 触及止损要出局&#xff0c;管它价格怎放肆。 强势多空价放宽&#xff0c;价格波动要空间&#xff1b; 大势不改…

【数学】什么是傅里叶级数与傅里叶变换?

傅里叶级数与傅里叶变换 背景 傅里叶级数和傅里叶变换是数学和工程领域中的重要工具&#xff0c;特别是在信号处理、图像处理和物理学中。傅里叶级数用于将周期函数表示为正弦和余弦函数的和&#xff0c;而傅里叶变换用于将任意函数表示为频率的函数。 公式 傅里叶级数&…

深度学习(十四)——优化器

前言 反向传播可以求出神经网路中每个需要调节参数的梯度(grad)&#xff0c;优化器可以根据梯度进行调整&#xff0c;达到降低整体误差的作用。下面我们对优化器进行介绍。 1. 如何使用优化器 官方文档:torch.optim — PyTorch 2.0 documentation &#xff08;1&#xff09;构…

Nexus安卓木马分析报告

概述 2023年3月21日晚上&#xff0c;链安与中睿天下联合研发的监控系统检测到一种新型安卓木马。在经过睿士沙箱系统捕获样本之后&#xff0c;发现该安卓木马极有可能是原安卓网银盗号木马SOVA的变种。与此同时&#xff0c;意大利安全公司Cleafy发布了一篇题为《Nexus&#xf…

JupyterLab使用指南(三):JupyterLab的Cell详细介绍

JupyterLab Cell 使用教程 JupyterLab 的 cell 是一种强大的工具&#xff0c;提供了编写、执行、展示和记录的全方位支持&#xff0c;使得复杂的计算任务变得简单直观。通过熟练掌握 cell 的各种操作和快捷键&#xff0c;用户可以显著提高工作效率&#xff0c;专注于解决实际问…

HNU操作系统2020年期中考试试卷及参考答案

1.&#xff08;15分&#xff09; 什么是多道程序技术&#xff0c;它带来了什么好处&#xff1f; 答&#xff1a; 多道程序设计&#xff0c;就是在内存中存放多个进程来执行人们赋予计算机的任务&#xff0c;这些在内存中的多个进程共享计算机的硬件资源&#xff0c;如CPU&…

C++函数作为参数

C++函数作为参数 在C++中,函数作为另一个函数的参数是非常常见的做法,特别是在处理回调函数和泛型编程时。我们展示了如何在C++中将函数作为参数传递给另一个函数,包括普通函数、std::function 和 std::bind、lambda表达式以及类成员函数。每种方法都有其独特的优势,可以根…

shell脚本中set -e用途

在shell脚本中&#xff0c;set -e 是一个命令&#xff0c;用于设置shell的退出行为。具体来说&#xff0c;当在脚本中执行一个命令&#xff0c;并且该命令返回非零退出状态时&#xff08;通常表示错误&#xff09;&#xff0c;set -e 会导致整个脚本立即退出&#xff0c;而不是…

2024/6/20 驱动day7GPIO子系统

GPIO子系统点六盏灯 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/gpio.h> #include <linux/of_gpio.h> struct device_node* node; struct device_node* child_node1; struct device_node* child…

Java实现俄罗斯方块——文本域组件

技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 2.初始化游戏界面&#xff1b; 3.初始化游戏的说明面板&#xff1b; 4.随机生成下落方块&#xff1b; 5.绘制方块&#xff1b; 6.清除方块&#xff1b; 7.清楚某一行方块&#xff0c;上方方块掉落&#xff1b; 8.刷新…

【loadrunner】生成指定长度随机字符串

#include “web_api.h” char* randstring(int slen) { char* result (char*)malloc(slen 1); //在loadrunner使用的C98语法&#xff0c;需要将所有定义都定义在函数头部&#xff0c;否则提示报错illegal statement termination char character_set[] "ABCDEFGHI…

IEC104文件传输协议

2024/6/19 20:25:07 IP Address 127.0.0.1 Port number 2404: (选择文件) T -> 68 11 08 00 18 00 7a 01 0d 00 01 00 00 00 00 01 00 00 01 2024/6/19 20:25:07 IP Address 127.0.0.1 Port number 2404: (文件准备就绪)R <- 68 13 18 00 0a 00 78 01 …

复分析——第5章——整函数(复可积函数)(E.M. Stein R. Shakarchi)

第5章 整函数(复可积函数)(Entire Functions) ...but after the 15th of October I felt myself a free man, with such longing for mathematical work, that the last two months flew by quickly, and that only today I found the letter of the 19th of October that…

STM32单片机-FLASH闪存

STM32单片机-FLASH闪存 一、FLASH简介二、FLASH工作原理三、读写内部FLASH四、读取芯片ID 一、FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程读写FLASH的用途&…

Web开发模式总结

Web开发模式总结如下&#xff1a; 一、基于服务器端渲染的传统Web开发模式 1. 介绍 服务器端渲染开发模式是指&#xff1a;服务器端通过字符串拼接&#xff0c;动态生成HTML结构和数据&#xff0c;交由客户端浏览器直接渲染的方式。客户端不需要使用Ajax等前后端交互技术额外…

[机器学习算法] 主成分分析

主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;是一种用于降维和特征提取的统计方法。它可以将高维数据投影到较低维度的空间中&#xff0c;同时尽量保留数据的变异性。以下是详细的学习步骤&#xff0c;包括理论和实际操作。 一、了解PCA的基本概念 数…

看广告收益小游戏app平台搭建

搭建一个看广告收益小游戏APP平台是一个复杂且涉及多个方面的过程。以下是一个大致的搭建流程&#xff1a; 市场调研与定位&#xff1a; 首先&#xff0c;进行市场调研&#xff0c;了解目标用户群体的需求和偏好&#xff0c;以及现有市场的竞争情况123。根据调研结果&#xff0…