Qt QDebug格式输出、自定义类输出及重定向输出Log

2023-05-16

1、qDebug() 格式化输出

qDebug格式化支持printf的格式化标识符

如果向函数传递格式字符串和参数列表,它的工作方式类似于C printf()函数。 格式应该是Latin-1字符串。

格式化demo

代码如下(示例):

void Widget::Printf() {
    QString str = "qwe";
    QDateTime dt = QDateTime::fromTime_t(time(NULL));
    qreal pi = 3.141592653589793;
    QString str_pi = QString::number(pi, 'g', 16);

    // 格式化输出
    qDebug("this is %s, Today is %04d-%02d-%02d, PI = %s", str.toLocal8Bit().data(), dt.date().year(),
           dt.date().month(), dt.date().day(), str_pi.toLocal8Bit().data());
}

2、qDebug() 自定义类输出

2.1、重载操作符 << 放在与类声明的头文件中, 在类的声明外部

mycalss类的头文件

代码如下(示例):

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QDebug>
#include <QString>

class MyClass {
public:
    MyClass();

    int Get_Id() const {return _id;}
    QString Get_Name() const {return _name;}

private:
    int _id = 1;
    QString _name = "qwe";
};

QDebug operator<<(QDebug debug, const MyClass &my_class);

#endif // MYCLASS_H

mycalss类的源文件

代码如下(示例):

#include "myclass.h"

MyClass::MyClass() {

}


QDebug operator<<(QDebug debug, const MyClass &my_class) {
    debug << "Id =" << my_class.Get_Id() << "name =" << my_class.Get_Name();
    return debug;
}

2.2、重载操作符 << 友元函数声明

mycalss类的头文件

代码如下(示例):

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QDebug>
#include <QString>

class MyClass {
protected:
    friend QDebug operator<<(QDebug debug, const MyClass &my_class);
    
public:
    MyClass();

    int Get_Id() const {return _id;}
    QString Get_Name() const {return _name;}

private:
    int _id = 1;
    QString _name = "qwe";
};
#endif // MYCLASS_H

mycalss类的源文件

代码如下(示例):

#include "myclass.h"

MyClass::MyClass() {

}
QDebug operator<<(QDebug debug, const MyClass &my_class) {
    debug << "Id =" << my_class._id << "name =" << my_class._name;
    return debug;
}

2.3、调用

void Widget::Printf_Class() { // 自定义类输出到qDebug
    MyClass my_class;

    qDebug() << my_class;
}

3、qDebug() 输出重定向 LOG 文件

多线程输出是需要考虑线程安全问题

QMutex 互斥量:QMutex类提供的是线程之间的访问顺序化。QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。

QMutexLocker 类:使用该类不用手动加锁释放锁,定义自动加锁,出作用于自动解锁。(RAII 资源获取即初始化)

定义相关的变量和接口

关键代码如下(示例):

QMutex mutex; // 为了支持多线程,需要使用锁来保护对日志文件的操作
QtMessageHandler system_default_message_handler = NULL; // 用来保存系统默认的输出接口
// 替换接口
void Custom_Message_Handler(QtMsgType type, const QMessageLogContext& context, const QString& info) {
    // 信息格式化
    QString log = QString::fromLocal8Bit("msg-[%1], file-[%2], func-[%3], category-[%4]\n")
            .arg(info).arg(context.file).arg(context.function).arg(context.category);
    bool bok = true;

    switch (type) {
    case QtDebugMsg:
        log.prepend("Qt dbg:");
        break;
    case QtWarningMsg:
        log.prepend("Qt warn:");
        break;
    case QtCriticalMsg:
        log.prepend("Qt critical:");
        break;
    case QtFatalMsg:
        log.prepend("Qt fatal:");
        break;
    case QtInfoMsg:
        log.prepend("Qt info:");
        break;
    default:
        bok = false;
        break;
    }
    if(bok) {
        // 加锁
        QMutexLocker locker(&mutex);

        QString str_file_name = "./log/log.inf";
        QString str_dir = "./log";
        QDir dir;
        dir.mkpath(str_dir);

        QFile file(str_file_name);

        if(! file.open(QFile::ReadWrite | QFile::Append)) {
            return;
        }

        file.write(log.toLocal8Bit().data());
        file.close();
    }

    if(bok) {
        // 调用系统原来的函数完成信息输出, 调试窗口
        if(NULL != system_default_message_handler) {
            system_default_message_handler(type, context, log);
        }
    }
}

在主函数进行输出重定向绑定

// 输出重定向
    system_default_message_handler = qInstallMessageHandler(Custom_Message_Handler);

运行结果图

 本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt QDebug格式输出、自定义类输出及重定向输出Log 的相关文章

  • android 抓完整的log的方式(包括logcat抓所有非内核log)

    log 分为 kernel main events radio 几种log kernel属于 linux内核的log xff0c 通过读取 proc kmsg 或者通过串口来抓取 USB连接手机抓取方式 xff1a adb shell ca
  • 常用Log抓取方法

    1 最常用抓取方法 尽可能保存issue现场 xff0c 记录issue时间 adb pull data logs 2 使用电脑cmd连接device xff0c 并使之正常输出logcat信息 adb logcat gt 路径 main
  • android抓取各种log的方法

    1 logcat xff08 四类log buffer是main xff0c radio xff0c system xff0c events xff09 adb wait for device logcat adb logcat v tim
  • Undo Log学习

    一 Undo Log的作用 数据库故障恢复机制的前世今生中提到过 xff0c Undo Log用来记录每次修改之前的历史值 xff0c 配合Redo Log用于故障恢复 这也就是InnoDB中Undo Log的第一个作用 xff1a 1 事
  • Android中的Log输出

    安卓系统的代码量十分庞大 xff0c 无法使用Jlink之类的工具进行单步调试 xff0c 因而日志系统十分有必要 为此 xff0c 安卓开发了Log日志类用于开发者的日常调试使用 Log中配置了五种Log类 xff0c 分别表示打印五类不
  • C语言自我实现模块化打印log

    在一个嵌入式稍微大些的工程中实现模块化控制打印输出信息是很有必要的 xff0c 下面是模仿别人的实现的模块化打印 xff0c 需要时可以根据下面的实现代码去修改满足自己所需要的 xff01 xff01 xff01 span class to
  • 解决mininet运行报错“ImportError: No module named mininet.log”

    解决mininet运行报错 ImportError No module named mininet log 运行环境 系统Ubuntu 04 安装Mininet 2 3 0d6问题描述 运行miniedit py时报错ImportError
  • QDebug

    当您使用Qt框架中的Qdebug时 xff0c 它会在调试过程中输出信息 默认情况下 xff0c Qdebug语句在发布版本中不会被编译到可执行文件中 但是 xff0c 在调试版本中 xff0c 这些语句会被编译进去 xff0c 以便您可以
  • Eclipse打不开,提示查看Log文件

    今天在使用Eclipse的时候 xff0c Eclipse整个黑屏 xff0c 然后果断启动任务管理器 xff0c 关掉了Eclipse然后重启 xff0c 发现Eclipse打不开了 xff0c 然后提示查看log文件 xff0c 然后解
  • 找不到系统安全日志/var/log/secure文件的问题

    今天打算配置一个服务器防止暴力破解的脚本 xff0c 原理不复杂 xff0c 搜索登录错误超过一定次数的ip地址 xff0c 加入防火墙 xff0c 但是在找登录日志的时候出现了问题 一般服务器的ssh登录等操作日志都是 var log s
  • 【日志工具】g3log_5_自定义log格式

    自定义日志格式 重载默认文件接收器的文件头 默认文件头可以在默认文件接收器中自定义 FileSink overrideLogHeader std string 重载默认文件接收器的日志格式 默认的日志格式是在LogMessage hpp s
  • 【mmdetection 】analyze_logs.py等工具测试

    绘制一些运行的分类损失 python tools analyze logs py plot curve work dirs faster rcnn r50 fpn 1x 20200306 175509 log json keys loss
  • mmdetection W&B 用wandb权重和偏差以进行记录

    如题 共需要修改四个文件 1 mmcv runner hooks logger init py from pavi import PaviLoggerHook from tensorboard import TensorboardLogge
  • 如何使用 Rsyslog 和 MySQL 设置 LogAnalyzer

    本文是文章的第二部分使用 MySQL 和 LogAnalyzer 设置 Rsyslog在 CentOS RHEL 系统上 在里面第一部分我们已经将Rsyslog与MySQL数据库服务器集成 所有日志现在都保存在数据库中 下面是我们在第 1
  • android log处理

    今天是新年上班的第一天 好高兴啊 感觉公司好亲切 可不是 开门红包抽中最高的啦 今天计划实现把导致软件崩溃的bug发送到服务器端 好让我根据bug 调试程序 通过查阅资料 遇到以下几个问题 1 把log文件发送到服务器 这个log是使程序崩
  • 132_Springboot总是会自动在/tmp/spring.log生成日志文件问题处理

    原因是项目配置文件中有如下引用
  • 04-Qt软件加入Log文件输出与终端彩色打印(包含行号)

    一 目的与需求 在开发qt应用程序中 经常使用打印调试软件 qt自己的qDebug 就满足了需求 但是当需要把一部分log记录到文件的时候qt就没有提供了 这个时候可以使用qDebug 的qInstallMsgHandler来指定打印回掉函
  • Springboot使用slf4j记录日志

    前言 在项目开发中 记录日志是必做的一件事情 而当我们使用Springboot框架时 记录日志就变得极其简单了 springboot内置了slf4j日志框架 我们只需要添加依赖 做一些简单的配置就ok了 下面 我们就来看看在Springbo
  • qDebug Qt 控制台应用程序输出到 Qt Creator 应用程序输出

    如何在 Qt 控制台应用程序中使用 qDebug 输出到 Qt Creator 应用程序输出 窗口 当前 qDebug 写入控制台窗口 这会干扰非调试输出 默认情况下 在 Qt GUI 应用程序中使用 qDebug 会输出到应用程序输出窗口
  • Qt qDebug() 在 Windows shell 中不起作用

    我正在使用一个qDebug Qt 框架的printf屏幕上有东西 当我从 Qt Creator 运行应用程序时它工作得很好 但是当我尝试从 Windows 执行它时cmd它什么也没显示 为什么会发生这种情况 你必须添加 CONFIG con

随机推荐

  • SQL常用语句大全

    我们在进行开发工作时 xff0c 对数据库的操作是必不可少的 xff0c 熟练掌握SQL语句可以让我们对数据库的数据处理变得非常简单 xff0c 所以学习SQL语句是非常有必要的 xff0c 下面汇总了一些常用的SQL语句 SQL语句的类型
  • VS配置Qt环境

    前言 Qt程序的开发不仅可以使用原生的Qt Creator xff0c 也可以使用Visual Studio 想使用VS进行Qt程序的开发 xff0c 需要安装Qt的插件 xff0c 下面看详细步骤 下载Qt的插件 地址 xff1a htt
  • STM32官方标准固件库开发与寄存器开发的区别

    一句话概括关系 xff1a 固件库就是函数的集合 xff0c 固件库函数的作用就是 xff1a 向下负责与寄存器直接打交道 xff0c 向上提供用户函数调用的接口 xff08 API xff09 对于STM32这种级别的MCU xff0c
  • CMake获取目录下所有源文件

    1 aux source directory指令 aux source directory lt dir gt lt variable gt 比如 xff1a aux source directory CMAKE CURRENT SOURC
  • Qt制作视频播放器

    前言 该播放器参考了SMPlayer xff0c 实现了其基础功能 xff0c 许多高级功能暂未实现 软件的实现基于Qt xff0c opencv xff0c 多线程以及数据库等相关知识 功能概述 支持本地音视频在线播放 xff0c url
  • Qt中QString与String的互相转换

    前言 Qt中的一些类型是Qt自己封装的 xff0c 例如我们平常常见的String在Qt中就是QString xff0c 但是有时我们调用第三方库时 xff0c 参数要求是String xff0c 这时我们就需要把QString转换成Str
  • Mat与QImage互相转换

    前言 Mat是opencv中的存储图像的容器 xff0c 也是图像像素矩阵 QImage是Qt中存储图片常用的类 Qt和opencv经常配合在一起使用 xff0c 但Qt的函数方法的参数是不接受Mat的 xff0c 所以如果我们想要在Qt中
  • CentOS7下安装libevent

    前言 CentOS7下安装libevent网络库 步骤 创建一个文件夹libevent xff08 方便后期维护管理 xff09 mkdir libevent 官网下载源码包 可以在本机下载然后文件传输 xff0c 也可以直接在linux下
  • Libevent源码深度剖析-张亮(转载)

    https blog csdn net xp178171640 article details 105490027
  • Qt6.4.3编译MySQL驱动

    前段时间电脑坏了重装了操作系统 软件都不能正常运行 大部分都得重装 本来用的Qt5 14 2 想着Qt都出6了 那就用用Qt6吧 Qt6想用mysql数据库也是得自己编译驱动的 但Qt6也是想推广CMake 所以我以前Qt5那一套编译mys
  • keil5中如何在一个项目中新建源文件

    哈喽哈喽 xff0c 昨天在学习如何点灯的时候接触到可以在一个已经建立好的项目中 xff0c 建立一个新的源文件写一个新的代码 这里就总结一下 点开file选择new xff0c 就会发现右边多个栏就说明源文件多了一个 xff0c 这个时候
  • 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因 xff0c 需要用到Python模拟登录网站 xff0c 但是以前对这块并不了解 xff0c 而且目标网站的登录方法较为复杂 xff0c 所以一下卡在这里了 xff0c 于是我决定从简单的模拟开始 xff0c 逐渐深入地研
  • 【VSCode】C++环境配置(小白必看)

    关于VSCode的c 43 43 环境配置 网上教程很多 xff0c 但大多是入门的新手小白难以理解 xff0c 操作不来的 xff0c 作者本人也是捣鼓了很久才配置好c 43 43 运行环境 本篇文章会从头到尾简述 一下vscode配置c
  • at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式

    at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式 半导体制冷片模拟除湿制冷 超声波雾化模块加湿 温湿度传感器检查环境温湿度 LCD液晶屏显示系统工作状态 全套包括实物成品 xff0c 原
  • Java常用类 - String类详解

    Java常用类 String类 创建字符串 xff1a 每个双引号括起来的字符串常量都是String类的一个实例 xff1b 也可以new 连接字符串 xff1a 43 xff1b string1 concat string2 span c
  • 如何利用#将宏定义中的参数插入到字符串中?

    首先明白几个原理 xff1a 在宏定义中 xff0c 如果宏参数为字符串 xff0c 可以把这个字符串放到字符串中 xff0c 但如果宏参数为变量的话就不可以 可以把宏定义中的参数转化为相应的字符串 xff0c 这时就可以把这个参数放到字符
  • ssmJavaEE无人机数据管理系统 毕业设计源码111022

    ssm无人机数据管理系统 摘 要 随着互联网趋势的到来 xff0c 各行各业都在考虑利用互联网将自己推广出去 xff0c 最好方式就是建立自己的互联网系统 xff0c 并对其进行维护和管理 在现实运用中 xff0c 应用软件的工作规则和开发
  • 【C语言】字符串函数strcat即自主实现

    目录 一 strcat函数 二 自主实现strcat 一 strcat函数 1 功能 xff1a 连接字符串 将源字符串的副本追加到目标字符串 目标中的终止空字符被源的第一个字符覆盖 xff0c 并在目标中两者的连接形成的新字符串的末尾包含
  • 2023版Postman接口测试使用全指南(原来使用 Postman测试API接口如此简单)

    下面是一篇详细介绍postman接口测试的文章 xff0c 如果文章内容不太明白的话 xff0c 我建议看看视频版本 xff0c 更加清洗 xff0c 更加直观 xff01 最详细的postman接口测试实战教程 哔哩哔哩 bilibili
  • Qt QDebug格式输出、自定义类输出及重定向输出Log

    1 qDebug 格式化输出 qDebug格式化支持printf的格式化标识符 如果向函数传递格式字符串和参数列表 xff0c 它的工作方式类似于C printf 函数 格式应该是Latin 1字符串 格式化demo 代码如下 xff08