日志重定向:让 qDebug() 实时显示在 Qt 窗口中

news/2025/11/26 14:49:55/文章来源:https://www.cnblogs.com/lizhiqiang0204/p/19272852
效果

image

源码

#include "mainwindow.h" // 包含主窗口头文件
#include <QApplication> // 包含 QApplication
#include <QTextEdit>    // 包含 QTextEdit,用于显示日志
#include <QScrollBar>   // 包含 QScrollBar(虽然这个例子中没直接用,但有时用于控制滚动条)
#include <QDateTime>    // 包含 QDateTime,用于获取时间戳
#include <QMetaObject>  // 包含 QMetaObject,用于跨线程调用
#include <QFileInfo>    // 包含 QFileInfo(此例中未使用,但常用于文件操作)
#include <QTextBlock>   // 包含 QTextBlock(此例中未使用,用于文本块操作)
#include <QTextDocument> // 包含 QTextDocument(此例中未使用,是 QTextEdit 的底层文档)
#include <QTextCursor>  // 包含 QTextCursor,用于控制文本编辑器的光标// 全局静态指针,指向用于显示日志的 QTextEdit 控件
static QTextEdit *g_logEdit = nullptr;/*** @brief 自定义消息处理器,用于将 Qt 消息(qDebug, qInfo 等)重定向到 g_logEdit 控件。* * @param type 消息类型 (QtDebugMsg, QtInfoMsg, etc.)* @param context 消息上下文(包含文件名、行号、函数名等)* @param msg 实际的消息字符串*/
void redirectOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{// 如果日志控件未设置,则直接返回,不处理消息if (!g_logEdit) return;QString prefix, color;// 根据消息类型设置前缀和颜色(使用 HTML 颜色代码)switch (type) {case QtDebugMsg:    prefix = "DEBUG";    color = "#2d2d2d"; break; // 深灰色case QtInfoMsg:     prefix = "INFO";     color = "#0066cc"; break; // 蓝色case QtWarningMsg:  prefix = "WARN";     color = "#cc6600"; break; // 橙色case QtCriticalMsg: prefix = "CRITICAL"; color = "#cc0000"; break; // 红色case QtFatalMsg:    prefix = "FATAL";    color = "#990000"; break; // 深红色default:            prefix = "UNKNOWN";  color = "#808080"; break; // 灰色
    }// 关键步骤:转义消息字符串,防止用户输入的内容(如 `<` 或 `&`)被解释为 HTML 标签// toHtmlEscaped() 只转义必要的字符,保持单行文本的格式。QString escapedMsg = msg.toHtmlEscaped(); // 只转义 <>&",保持单行// 如果原始消息中包含换行符 `\n`,并且希望在 QTextEdit 中也换行,// 可以使用:escapedMsg = msg.replace("\n", "<br/>").toHtmlEscaped();// 格式化日志行,使用 HTML 标签进行着色和格式控制QString line = QString(// 使用 C++11 的原始字符串字面量 R"(...)" 避免对引号和反斜杠的转义R"(<font color="#888888">[%1]</font> <font color="#00aa00">%2:</font> <font color="%3">%4</font><br>)")// %1:时间戳 (hh:mm:ss.zzz).arg(QDateTime::currentDateTime().toString("hh:mm:ss.zzz"))// %2:日志级别前缀,-8 表示固定宽度左对齐.arg(prefix, -8)// %3:日志文本颜色
                       .arg(color)// %4:转义后的日志内容.arg(escapedMsg); // 使用转义后的 msg,并用 <br> 强制换行// 因为日志消息可能在非 GUI 线程中产生,所以必须使用 QMetaObject::invokeMethod// 将更新 UI 的操作(插入 HTML)放入 GUI 线程的事件队列中。
    QMetaObject::invokeMethod(g_logEdit, [line]() {QTextEdit *edit = g_logEdit;// 移动光标到文档末尾edit->moveCursor(QTextCursor::End);// 插入格式化好的 HTML 日志行edit->insertHtml(line);// 确保光标(和文档末尾)可见,实现自动滚动edit->ensureCursorVisible();}, Qt::QueuedConnection); // 使用 Qt::QueuedConnection 确保是异步跨线程调用
}/*** @brief 程序的入口点*/
int main(int argc, char *argv[])
{// 创建 QApplication 实例
    QApplication a(argc, argv);// 安装自定义消息处理器,替换 Qt 默认的处理器
    qInstallMessageHandler(redirectOutput);// 创建主窗口实例
    MainWindow w;// 查找主窗口中名为 "textEditLog" 的 QTextEdit 控件,并将其赋值给全局指针g_logEdit = w.findChild<QTextEdit*>("textEditLog");// 显示主窗口
    w.show();// 发送一些测试消息,它们现在应该会被重定向到 QTextEdit 控件中qDebug() << "程序启动成功!所有 qDebug() 现在都会显示在这里";qInfo()    << "这是一条 Info 消息";qWarning() << "这是一条警告消息";qCritical()<< "这是一条严重错误消息";// 启动 Qt 事件循环return a.exec();
}
main.cpp
#include "mainwindow.h" // 包含主窗口的头文件
#include "ui_mainwindow.h" // 包含由 Qt Designer 生成的 UI 头文件
#include <QTextEdit>    // 包含 QTextEdit 控件
#include <QVBoxLayout>  // 包含 QVBoxLayout(虽然这里没有直接使用布局类,但包含了常用的 UI 控件头文件)/*** @brief MainWindow 类的构造函数* @param parent 父 QWidget 指针,通常为 nullptr*/
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) // 调用 QMainWindow 基类的构造函数, ui(new Ui::MainWindow) // 初始化 ui 成员指针
{// 设置由 Qt Designer 生成的界面元素(如果使用 designer 的话,但这里主要通过代码创建控件)ui->setupUi(this);// ---------- 创建并配置日志文本框 ----------// 动态创建 QTextEdit 控件,并指定父对象为当前 MainWindowQTextEdit *logEdit = new QTextEdit(this);// 设置对象的名称。这个名字 ("textEditLog") 是 main.cpp 中用于查找并关联日志重定向函数的关键!logEdit->setObjectName(QStringLiteral("textEditLog"));// 设置文本框为只读,用户不能手动编辑日志内容logEdit->setReadOnly(true);// 设置行自动换行模式为不换行。日志通常需要水平滚动条来查看完整的一行。logEdit->setLineWrapMode(QTextEdit::NoWrap);// 使用 QStyleSheet 设置日志文本框的样式logEdit->setStyleSheet(R"(
        QTextEdit {// 设置等宽字体,如 Consolas,以保持日志时间戳和前缀对齐整齐font-family: "Consolas", "Courier New", "DejaVu Sans Mono", monospace;// 设置字体大小font-size: 10pt;// 移除默认的边框,使外观更简洁
            border: none;})");// 将新创建的日志文本框设置为 MainWindow 的中心控件
    setCentralWidget(logEdit);
}/*** @brief MainWindow 类的析构函数*/
MainWindow::~MainWindow()
{// 释放由 ui 成员指针指向的资源delete ui;
}
mainwindow.cpp

 

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

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

相关文章

铝单板厂家哪家好?河南霖锋幕墙用品质与实力给出答案

铝单板厂家哪家好?河南霖锋幕墙用品质与实力给出答案在建筑装饰材料领域,铝单板凭借其轻质、耐用、美观且可定制化的优势,成为众多建筑项目的优选。面对市场上琳琅满目的铝单板厂家,“铝单板厂家哪家好?” 成为采…

2025 河南网站建设权威榜单:三大本土服务商

2025 河南网站建设权威榜单:三大本土服务商2025 年河南数字经济规模持续扩容,河南郑州作为中原经济区核心增长极,企业网站建设与短视频运营需求爆发。数据显示,河南 83% 的规上企业亟需专业的网站建设、网页设计及…

2025 河南网站建设公司推荐 3 家口碑好的网站制作公司

2025 河南网站建设公司推荐 3 家口碑好的网站制作公司2025 年数字化营销竞争加剧,选对口碑与实力兼具的网站建设公司,是企业打造线上形象、实现高效获客的关键。河南作为中原互联网核心城市,孕育了多家优质服务商,…

佳能e478扫描

佳能e478扫描手册: E478 : 使用IJ Scan Utility轻松扫描 wifi连接电脑: 1.长按wifi键,直到蓝灯闪烁。 2.点最下面的彩色按钮,网络灯亮起,再按一次,wifi蓝灯闪烁。 3.打开手机wifi,然后连接上cannon的无线网。 4.…

dm定位慢sql

查看ENABLE_MONITOR、MONITOR_SQL_EXEC参数设置 select SF_GET_PARA_VALUE(2,ENABLE_MONITOR); select SF_GET_PARA_VALUE(2,MONITOR_SQL_EXEC); 如果值为0 说明没开启,开启参数如下 CALL SP_SET_PARA_VALUE(1, ENABL…

活动预告|本周六!IvorySQL 邀您相聚第八届中国 PostgreSQL 数据库生态大会

作为中国开源软件联盟 PostgreSQL 分会年度 TOP 会议,本届大会以“开源无界 探索无限可能”为主题,于 2025 年 11 月 29 日在杭州举办。 组委会邀请多位行业权威专家与技术大咖亲临现场,与广大开发者、DBA、企业用户…

后保研可以中途换老师吗?服务过程中的师资调整机制说明

在报名保研辅导服务后,学员有时可能会遇到与辅导老师教学风格不匹配、沟通不畅或专业方向不够契合等情况。此时,“能否中途更换老师”成为一个实际而重要的需求。本文将基于后保研(HBY)公开的服务机制与相关说明,…

深入解析:微电子科学与工程专业毕设选题指南:热门方向推荐 2026届

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

突破成绩限制:后保研如何助力不同排名学生实现院校跃升?

随着研究生推免竞争日益激烈,越来越多的学生开始寻求专业机构的指导来增强自身竞争力。在众多保研辅导机构中,后保研以其独特的无门槛服务模式脱颖而出。本文将深入解析后保研的服务特色,探讨其如何帮助不同成绩排名…

2025年口碑好的四川自助洗车加盟厂家推荐及选择参考

2025 年口碑好的四川自助洗车加盟厂家推荐及选择参考在汽车后市场消费升级与创业热潮叠加的 2025 年,自助洗车凭借 “便捷、高效、低成本” 的核心优势,成为创业加盟的热门赛道。四川作为西南汽车保有量大省,自助洗…

保研规划哪家有保障?这份保研机构挑选指南请收好

随着保研竞争日趋白热化,"选择一家有保障的规划机构"已成为许多学子关心的头等大事。面对市场上令人眼花缭乱的承诺和宣传,如何辨别真伪、找到真正能托付信任的合作伙伴,直接关系到保研的成败与未来。一份…

2025新款卫衣厂家推荐:COVERNAT男女薄厚款,简约复古百搭之选

2025新款卫衣技术革新:COVERNAT如何定义简约复古新风尚 卫衣行业面临的技术挑战与创新突破 随着2025年的临近,卫衣行业正面临着前所未有的技术挑战。根据最新行业数据显示,全球卫衣市场规模预计将达到980亿美元,但…

年会策划公司哪家性价比高?这十大策划公司按需选配不花冤枉钱!

在筹备年会这一企业重要活动时,选择一家性价比高、能够提供模块化方案且按需选配的策划公司至关重要。本文将详细介绍十家年会策划公司,帮助您找到最适合的合作伙伴,确保年会既精彩又经济。 一、深圳市千禧晨文化传…

2025年11月最新成都实木隔断源头厂家排名揭晓

2025年11月最新成都实木隔断源头厂家排名揭晓随着仿古建筑、中式装修需求的激增,成都实木隔断市场迎来爆发期。源头厂家的选择直接决定产品品质与工程效果,本文结合推荐指数、口碑评分、客户推荐及资质实力,揭晓当前…

2025 年 11 月棒球帽品牌实力推荐榜:涵盖薄款/厚款/男款/女款/可水洗/复古款/潮流款/运动款,精选百搭设计与舒适面料之选

2025 年 11 月棒球帽品牌实力推荐榜:涵盖薄款/厚款/男款/女款/可水洗/复古款/潮流款/运动款,精选百搭设计与舒适面料之选 棒球帽作为兼具实用性与时尚性的配饰,近年来在全球服饰市场中占据重要地位。随着消费者对个…

分布式架构原理与实现---第二篇

(一)分布式调用 服务和应用的调用基于场景的不同会分为几种情况: 1 系统外的客户端调用系统内的服务时需要通过反向代理和负载均衡的方式; 2 系统架构内部服务之间的调用需要通过 API 网关; 3 服务之间的互相感知…

2025在职保研规划机构综合评测报告:10 家靠谱机构横向对比

随着高校推免比例持续提高,保研已成为众多学子进入理想硕士项目的核心路径。然而,信息壁垒、激烈竞争和繁琐流程让独自备战变得困难。专业的保研辅导机构能提供精准的政策解读、系统规划以及丰富资源,成为助力学子成…

车规TVS管行业现状与技术发展趋势分析-ASIM阿赛姆

一、市场规模与增长驱动 2024年全球车规TVS市场规模约12亿美元,预计到2030年将增长至20亿美元,年复合增长率约8.5%。核心驱动力来自新能源汽车渗透率提升与汽车电子化程度加深。传统燃油车TVS用量约30颗/车,新能源车…

后保研课程可回放?从线上服务体验看后保研课程学习灵活性

随着各大高校保研竞争逐年加剧,市场上涌现出众多声称能“助力上岸”的辅导机构。在选择保研辅导服务时,线上课程的灵活性与可复用性成为许多学员关注的重点。尤其是对于课业繁重、时间不固定的学生而言,是否支持课程…

2025年深圳这家DSE培训机构成果亮眼

公司介绍:ALV爱乐惟国际教育(前身ALV一等国际教育)创办于2011年。十五年专注国际教育培训,从一家校区发展成五家校区,成为深圳区域的教育连锁机构。业务涵盖IGCSE、A-LEVEL、SAT、SSAT、AP、ACT、IB、DSE、雅思、…