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

Qt QDebug格式输出、自定义类输出及重定向输出Log1 qDebug 格式化输出 qDebug 格式化支持 printf 的格式化标识符如果向函数传递格式字符串和参数列表 它的工作方式类似于 C printf 函数 格式应该是 Latin 1 字符串

欢迎大家来到IT世界,在知识的湖畔探索吧!

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.9793; 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()); }

欢迎大家来到IT世界,在知识的湖畔探索吧!

2、qDebug() 自定义类输出

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

mycalss类的头文件

代码如下(示例):

欢迎大家来到IT世界,在知识的湖畔探索吧!#ifndef MYCLASS_H #define MYCLASS_H #include 
  
    #include 
   
     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; }

mycalss类的头文件

代码如下(示例):

欢迎大家来到IT世界,在知识的湖畔探索吧!#ifndef MYCLASS_H #define MYCLASS_H #include 
  
    #include 
   
     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; }

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

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

QT开发交流+赀料君羊:

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

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

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

定义相关的变量和接口

关键代码如下(示例):

欢迎大家来到IT世界,在知识的湖畔探索吧!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 QDebug格式输出、自定义类输出及重定向输出Log



欢迎大家来到IT世界,在知识的湖畔探索吧!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/112845.html

(0)
上一篇 8分钟前
下一篇 2025年 6月 21日 下午8:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信