当前位置: 首页 > news >正文

Qt的日志输出

在Qt中,一般习惯使用qDebug信息进行输出和打印调试信息到console或者文件中,在qDebug中,也有一些小技巧,可以帮助我们更好的使用qDebug打印日志记录,本文分享了qDebug使用的一些小技巧。


1. 打印出文件名、行号、调用函数等上下文信息

    有些时候是不是可能会遇见这样的事情,自己不知道在哪儿打印了一串debug信息,但是现在不知道在哪儿了,并且由于文件很多,比较难以寻找。本次提到的方法就可以解决这个问题。首先,要明白一件事,打印出行号、文件名一定要在调用qDebug时就知道当前位置,C语言是通过 __FILE__ __LINE__ 这些东西得到的,而qDebug也是一样的方式,它是一个宏实现是这个样子的。

#define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug
#define qInfo QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).info
#define qWarning QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).warning
#define qCritical QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).critical
#define qFatal QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).fatal

而其中

#define QT_MESSAGELOG_FILE __FILE__
#define QT_MESSAGELOG_LINE __LINE__
#define QT_MESSAGELOG_FUNC Q_FUNC_INFO

    所以,qDebug 本身应该是支持了打印上下文信息的,但是为什么我们平时打印的信息没有呢?

    这个是因为需要去设置一下message的pattern

    设置pattern有两种方法:

  1. qSetMessagePattern 函数
    通过函数设置格式,例如: qSetMessagePattern("[%{type}]%{file}:%{line}\t%{time}\t%{function}\n%{message}")

  2. QT_MESSAGE_PATTERN 环境变量
    通过设置全局环境变量或者使用qputenv("QT_MESSAGE_PATTERN", "[%{type}]%{file}:%{line}\t%{time}\t%{function}\n%{message}");的手法,来设置pattern

    或者换个思路,qt为我们提供了一个handle,使用 qInstallMessageHandler设置

void msgHandle(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{printf("Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
}qInstallMessageHandler(msgHandle);

2. 将qDebug内容输出到文件中

    将qDebug输出到文件当中则是直接采用 qInstallMessageHandler的思路来做,在这个函数中,将printf改成fprintf即可。

3. 正式运行时屏蔽掉 debug 信息

    在qlogging.h中有一段代码

#if defined(QT_NO_DEBUG_OUTPUT)
#  undef qDebug
#  define qDebug QT_NO_QDEBUG_MACRO
#endif

    意味着其实当定义了上面的qDebug宏后,其实下面还有宏条件重新定义,展开看看 QT_NO_QDEBUG_MACRO则是

#define QT_NO_QDEBUG_MACRO while (false) QMessageLogger().noDebug

    所以,我们在编译时,加入一个宏即可(pro文件直接写法如下:)

DEFINES += QT_NO_DEBUG_OUTPUT

相关文章:

Qt的日志输出

在Qt中,一般习惯使用qDebug信息进行输出和打印调试信息到console或者文件中,在qDebug中,也有一些小技巧,可以帮助我们更好的使用qDebug打印日志记录,本文分享了qDebug使用的一些小技巧。 1. 打印出文件名、行号、调用函…...

基于热交换算法优化概率神经网络PNN的分类预测 - 附代码

基于热交换算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于热交换算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于热交换优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…...

main.js 中的 render函数

按照之前的单组件文件中的写法&#xff0c;我们的写法应该是这样的 import App from ./App.vuenew Vue({el: #app,templete: <App></App>,components: {App}, }) 1、定义el根节点。2、注册App组件。3、渲染 templete 模板 但是在脚手架工程中&#xff0c;他是这…...

Pandas 将DataFrame中单元格内的列表拆分成单独的行

使用 explode 函数 import pandas as pddata {month: [1, 2],week: [[i for i in range(2)], [i for i in range(3)]]} df pd.DataFrame(data) print(df)df df.explode(week) print(df)...

PDF转化为图片

Java 类 PDF2Image 在包 com.oncloudsoft.zbznhc.common.util.pdf 中是用来将 PDF 文件转换为图像的。它使用了 Apache PDFBox 库来处理 PDF 文档并生成图像。下面是类中每个部分的详细解释&#xff1a; 类和方法说明 类 PDF2Image: 使用了 Lombok 库的 Slf4j 注解&#xff0c…...

【Java】智慧工地管理系统源码(SaaS模式)

智慧工地是聚焦工程施工现场&#xff0c;紧紧围绕人、机、料、法、环等关键要素&#xff0c;综合运用物联网、云计算、大数据、移动计算和智能设备等软硬件信息技术&#xff0c;与施工生产过程相融合。 一、什么是智慧工地 智慧工地是指利用移动互联、物联网、智能算法、地理信…...

torch.nn.functional.log_softmax 函数解析

该函数将输出向量转化为概率分布&#xff0c;作用和softmax一致。 相比softmax&#xff0c;对较小的概率分布处理能力更好。 一、定义 softmax 计算公式&#xff1a; log_softmax 计算公式&#xff1a; 可见仅仅是将 softmax 最外层套上 log 函数。 二、使用场景 log_soft…...

jQuery、vue、小程序、uni-app中的本地存储数据和接受数据是什么?

在这四个工具/框架中&#xff0c;Uni-app和微信小程序比较类似&#xff0c;因为它们都是为了实现跨平台开发而设计的。 jQuery 是一个快速、小巧且特性丰富的 JavaScript 库。它提供了各种操作和处理 HTML DOM、事件、动画&#xff0c;以及提供各种工具函数的功能。然而&#…...

黑马React18: 基础Part 1

黑马React: 基础1 Date: November 15, 2023 Sum: React介绍、JSX、事件绑定、组件、useState、B站评论 React介绍 概念: React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 优势: 1-组件化的开发方式 2-优秀的性能 3-丰富的生态 4-跨平台开发 开发环境搭…...

windows Oracle Database 19c 卸载教程

目录 打开任务管理器 停止数据库服务 Universal Installer 卸载Oracle数据库程序 使用Oracle Installer卸载 删除注册表项 重新启动系统 打开任务管理器 ctrlShiftEsc可以快速打开任务管理器&#xff0c;找到oracle所有服务然后停止。 停止数据库服务 在开始卸载之前&a…...

动态规划解决leetcode上的两道回文问题(针对思路)

本期主讲的是使用动态规划去解决两道回文问题&#xff0c;分别是 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 516. 最长回文子序列 - 力扣&#xff08;LeetCode&#xff09; 而不是leetcode5.最长回文子串&#xff0c;虽然这道题也是回文问题&#xff0c;也可以…...

使用人工智能自动测试 Flutter 应用程序

移动应用程序开发的增长速度比以往任何时候都快。几乎每个企业都需要移动应用程序来保持市场竞争力。由于像 React Native 这样的跨平台移动应用程序开发框架允许公司使用单一源代码和单一编程语言构建 iOS 和 Android 应用程序&#xff0c; Flutter是 Google 支持的另一个热门…...

四、程序员指南:数据平面开发套件

REORDER LIBRARY 重排序库提供了根据其序列号对mbuf进行重排序的机制。 16.1 操作 重排序库本质上是一个对mbuf进行重新排序的缓冲区。用户将乱序的mbuf插入重排序缓冲区&#xff0c;并从中提取顺序正确的mbuf。 在任何给定时刻&#xff0c;重排序缓冲区包含其序列号位于序列…...

Go 之 captcha 生成图像验证码

目前 chptcha 好像只可以生成纯数字的图像验证码&#xff0c;不过对于普通简单应用来说也足够了。captcha默认将store封装到内部&#xff0c;未提供对外操作的接口&#xff0c;因此使用自己显式生成的store&#xff0c;可以通过store自定义要生成的验证码。 package mainimpor…...

【Java从入门到大牛】多线程

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年11月18日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f4…...

UE5 C++报错:is not currently enabled for Live Coding

解决办法&#xff1a; 再次打开项目&#xff0c;以此法打开&#xff1a;...

mysql服务器数据同步

在Linux和Windows之间实现MySQL服务器数据的同步。下面是一些常见的方法和工具&#xff1a; 复制&#xff08;Replication&#xff09;&#xff1a;MySQL复制是一种常见的数据同步技术&#xff0c;可用于将一个MySQL服务器的数据复制到其他服务器。您可以设置主服务器&#xff…...

Docker Golang 开发环境搭建指南

Docker Golang 开发环境搭建指南 概述 在 Golang 开发中&#xff0c;搭建合适的开发环境是非常重要的。然而&#xff0c;由于 Golang 的跨平台特性&#xff0c;不同操作系统之间的配置差异可能会导致环境搭建过程变得复杂。为了简化这个过程并保持开发环境的一致性&#xff0…...

MFC保存窗口客户区为图片

首先的窗口输出一些内容&#xff1b; 菜单单击函数代码&#xff1b; void CgetmypicView::OnTestGetmypic() {// TODO: 在此添加命令处理程序代码HWND hwnd this->GetSafeHwnd();HDC hDC ::GetWindowDC(hwnd);//获取DC RECT rect;::GetClientRect(hwnd, &rect)…...

JAVA安全之Shrio550-721漏洞原理及复现

前言 关于shrio漏洞&#xff0c;网上有很多博文讲解&#xff0c;这些博文对漏洞的解释似乎有一套约定俗成的说辞&#xff0c;让人云里来云里去&#xff0c;都没有对漏洞产生的原因深入地去探究..... 本文从现象到本质&#xff0c;旨在解释清楚Shrio漏洞是怎么回事&#xff01…...

河海大学材料科学与工程及材料与化工专业考研复试资料(含《材料分析方法》笔试专项)

温馨提示&#xff1a;文末有联系方式河海大学材料类考研复试资料全面升级 本套资料专为报考河海大学材料科学与工程、材料与化工两个硕士专业的考生设计&#xff0c;聚焦复试核心笔试科目——《材料分析方法》&#xff0c;助力精准高效备考。由2025届一志愿录取考生权威整理 所…...

从Android大神到AI先锋!10年程序员血泪转型路,AI工程师高薪秘诀全公开!

一眨眼&#xff0c;我已经工作 10 年了。 在 2022 年以前&#xff0c;我一直相信&#xff0c;在这个行业里&#xff0c;只要技术栈钻得深&#xff0c;比如精通三方框架、熟悉 Android Framework、搞定性能优化&#xff0c;就能端稳饭碗。 但从 2023 年开始&#xff0c;一切都变…...

Starry Night Art Gallery效果展示:黄金渐变按钮交互+实时生成反馈

Starry Night Art Gallery效果展示&#xff1a;黄金渐变按钮交互实时生成反馈 1. 沉浸式艺术体验&#xff1a;当AI遇见文艺复兴 想象一下&#xff0c;你走进的不是一个冰冷的AI工具界面&#xff0c;而是一座数字艺术殿堂。四周是深邃的墨蓝色背景&#xff0c;如同梵高笔下的夜…...

保姆级教程:用Python脚本一键将Labelme标注数据喂给YOLOv5/v8训练

从Labelme到YOLO&#xff1a;全流程数据转换与训练实战指南 当你完成数百张图像的Labelme标注后&#xff0c;面对满屏的JSON文件&#xff0c;是否曾为如何高效转换为YOLO格式而头疼&#xff1f;本文将以工业级解决方案&#xff0c;带你打通从标注到训练的全链路。不同于简单的格…...

ROBLEX嵌入式驱动库技术解析与机器人控制实践

1. ROBLEX开发套件底层驱动库技术解析ROBLEX开发套件是一套面向教育与原型验证的嵌入式硬件平台&#xff0c;其核心由主控底板&#xff08;通常基于STM32F4系列MCU&#xff09;与可插拔功能模块&#xff08;如电机驱动、红外测距、超声波测距、环境传感器、LED阵列、蜂鸣器、编…...

Vision Transformer在timm中的实现与优化

Vision Transformer在timm中的实现与优化 【免费下载链接】pytorch-image-models The largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Visi…...

Axelspace 太空公司牵头联合体入选日本太空战略基金项目 “提升下一代地球观测卫星能力技术”

—— 通过卫星星座与航空器开展特定排放源二氧化碳排放与吸收监测&#xff0c;打造气候解决方案&#xff0c;开拓全新市场机遇 Axelspace 太空公司、明星电气株式会社、全日空控股株式会社及 JIJ 株式会社联合宣布&#xff0c;各方共同申报的技术研发项目成功入选日本宇宙航空…...

别再手动调时间了!手把手教你用LinuxPTP的ptp4l和phc2sys搞定TSN网络时钟同步

工业TSN网络高精度时钟同步实战&#xff1a;从原理到生产环境部署 在工业自动化、智能驾驶和实时音视频传输领域&#xff0c;微秒级的时间同步已成为刚需。传统NTP协议毫秒级的精度在这些场景下显得力不从心&#xff0c;而基于IEEE 1588和802.1AS协议的PTP&#xff08;精确时间…...

【Matlab】MATLAB教程:图形句柄;案例:h=plot(x,y);应用:控制图形属性

MATLAB教程:图形句柄;案例:h=plot(x,y);应用:控制图形属性 在MATLAB数据可视化、实验报告绘图、工程结果展示等场景中,仅仅通过plot函数绘制基础图形远远不够。实际科研与工程应用中,往往需要精准调整图形的线条样式、颜色、标记点、坐标轴、图例等属性,让图形更清晰、…...

造相-Z-Image-Turbo 在嵌入式设备上的探索:基于NVIDIA Jetson的轻量化部署

造相-Z-Image-Turbo 在嵌入式设备上的探索&#xff1a;基于NVIDIA Jetson的轻量化部署 最近在折腾一个挺有意思的项目&#xff0c;想把一个叫“造相-Z-Image-Turbo”的图片生成模型&#xff0c;塞进像NVIDIA Jetson这样的嵌入式小盒子里。你可能知道&#xff0c;这类模型通常都…...