qInstallMessageHandler的学习

背景:需要做一个日志系统

把信息重定向到txt文件中。

参考: 

QT 调试信息如何输出到文件(qDebug/qWarning/qCritical/qFatal)-CSDN博客

Qt 之 qInstallMessageHandler(重定向至文件)-CSDN博客 

demo:

#include <QApplication>
#include <QMutex>
#include <QFile>
#include <QTextStream>
#include <QDebug>
static QMutex mutex;
//void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{QString txt;switch (type) {case QtDebugMsg:txt="qDebug:";break;case QtInfoMsg:txt="qInfo:";break;case QtWarningMsg:txt="qWarning:";break;case QtCriticalMsg:txt="qCritical:";break;}mutex.lock();QFile file("log.txt");file.open(QIODevice::WriteOnly|QIODevice::Append);QTextStream text_stream(&file);text_stream<<txt+msg<<"\r\n";text_stream<<QString(context.file)<<"\r\n";text_stream<<QString::number(context.line)<<"\r\n";text_stream<<QString(context.function)<<"\r\n";file.close();mutex.unlock();
}int main(int argc, char *argv[])
{QApplication a(argc, argv);qInstallMessageHandler(customMessageHandler);qDebug()<<"111";qInfo()<<"222";qWarning()<<"333";qCritical()<<"444";return a.exec();
}

 关键:

 qInstallMessageHandler(customMessageHandler);

这是一个回调函数

当执行qDebug(),qInfo()......这些的时候,

会调用customMessageHandler()函数

QtMessageHandler qInstallMessageHandler(QtMessageHandler handler); 

为什么要加锁呢?

我的理解:

比如:

qDebug()<<"123"; 
qDebug()<<"456";

这两条语句都会触发customMessageHandler函数,那么可能会出现抢夺log.txt文件使用权的问题,所以要加锁

关于 context.file, context.line, context.function

文件名,文件行数,所在的函数名。 

 

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

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

相关文章

考试周刊杂志考试周刊杂志社考试周刊编辑部2023年第46期目录

教育教学研究 丰富作业形式 拓展课堂教学——“双减”下初中英语优化作业设计探析 王慧; 1-5 博学慎思明辨 撬动思维杠杆——论“思辨性阅读与表达”学习任务群范式构建 丁亚琴; 6-10《考试周刊》投稿邮箱&#xff1a;cn7kantougao163.com(注明投稿“《考试周刊》”) 崔…

Python读取modbus RTU协议

Python读取modbus RTU协议 下载modbus_tk库 pip3 install modbus_tkexecute主要函数 参考文章Python玩转modbus 软件模拟 vspdmodbus slave 虚拟COM1和COM2 modbus slave连接COM2口 更改从机数据 Python读取 import serial from modbus_tk import defines as cst from m…

如何更好的设计测试用例,看完就懂了。。。

引言 测试用例设计的最基本要求&#xff1a;覆盖住所要测试的功能。这是再基本不过的要求了&#xff0c;但别看只是简单的一句话&#xff0c;要能够达到切实覆盖全面&#xff0c;需要对被测试产品功能的全面了解、明确测试范围(特别是要明确哪些是不需要测试的)、具备基本的测…

java.sql.SQLException: No suitable driver 问题解决

问题出现 自己在写一个连接C3P0数据库连接池库的测试类&#xff0c;运行该类后出现了下图这个问题 这是我写的测试类 package demo;import com.mchange.v2.c3p0.ComboPooledDataSource;import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLExcept…

Java根据指定端口关闭进程(端口占用 Web server failed to start. Port 6061 was already in use.)

查询指定端口的pid netstat -ano | findstr 6063杀掉进程 taskkill /f /pid 36804

MySQL基本SQL语句(上)

MySQL基本SQL语句&#xff08;上&#xff09; 一、客户端工具的使用 1、客户端工具mysql使用 mysql: mysql命令行工具&#xff0c;一般用来连接访问mysql数据库 选项说明-u, --username指定登录用户名-p, --password指定登录密码(注意是小写p),一定要放到最后面-h, --hostn…

1、环境搭建

开发工具下载安装 要求电脑内存8G以上&#xff0c;建议16 下载安装包 进入官网点击下载 https://developer.harmonyos.com/cn/develop/deveco-studio/ 解压并安装 一路next进行安装 在这里插入图片描述 到此位置&#xff0c;安装完成&#xff0c;叉掉当前检测界面即可使用该…

java多线程-扩展知识二:线程的生命周期

1、生命周期 生命周期有广义与狭义之分&#xff0c;狭义为生命科学术语&#xff0c;指包括人类在内的一切动物由出生到死亡经历的生命全程。广义的生命周期泛指自然界与人类社会各种客观事物的阶段性变化及规律&#xff0c;如家庭生命周期、产品生命周期等。本义即狭义的生命周…

【JavaEE】Java中的多线程 (Thread类)

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

用队列和栈分别实现栈和队列

用队列实现栈 题目解读 本题的要求是要用两个队列来实现一个先进后出的栈&#xff0c;并且要有以下功能&#xff1a; 1.将元素压入栈中 2.移除栈顶元素并且返回他 3.返回栈顶元素 4.判断栈是否为空 题目构思和代码实现 我们首先要做的就是将实现队列的代码导入该题&#xff…

C语言打印九九乘法表的多种方式多种形式(完整,左上,左下,右上,右下)

&#x1f4e2;博客主页&#xff1a;肩匣与橘&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649;&#x1f4e2;生活依旧是美好而又温柔的&#xff0c;你也是✨ …

CodeWhisperer——一个十分强大的工具

使用心得&#xff1a; Amazon CodeWhisperer 是亚⻢逊出品的一款基于机器学习的 AI 编程助手&#xff0c;可实时提供代码建议。现在已正式可用&#xff0c;面向个人提供免费服务&#xff0c;通过在各种流行的 IDE 里集成 CodeWhisperer&#xff08;包括我们常用的 JetBrains 产…