如何输出 QT 源码中的日志?

原文地址

https://www.cnblogs.com/dizf/p/12456900.html

 

QT的应用程序在运行过程中,自己程序的日志,我们是可以控制并打印输出的,那么当我们想定位到源码中,查看某些错误输出或者执行顺序时,这时候就需要打开qt源码的日志开关了。

 一、对于qt本身的模块

我们查看qt的源码,看其日志输出使用的是:qCDebug,qCWarning,qCInfo,qCCritical,

 

 

那么怎么打开QT的源码中累似qCDebug输出呢?

我们了解到,qt本身有一套完整的日志框架 ----> QLoggingCategory 

QLoggingCategory可以控制打印输出类别和模块。方便在调试时,过滤掉不关心的打印信息。

以qCDebug做说明:

我们打开qt,windows的源码,看qwindowstablesupport类(此类是关于windows下手写板的触控类)

 

 

 

看到qCDebug得第一个参数 lcQpaTablet,我们找到其对应的声明,发现它代表了一个模块名:

 

 

 

我们知道了qCDebug打印日志,是分模块打印输出的,对应各自的模块,那么怎么打开这个模块对应的日志输出呢?

我们通过查看QLoggingCategory类的说明,发现有五种方法设置日志过滤规则及优先级:

如果我们使用qt默认的配置,关于过滤配置文件的路径,通过代码查看,可知qt读取默认的配置路径为:%AppData%\Local/QtProje

 

1. 通过注册的方法

 

 

 2.  QtProject/qtlogging.ini:在%AppData%\Local/QtProject创建qtlogging.ini文件 

 

3.  QLoggingSettingsParser 设置过滤规则

 

 

 

4. QT_LOGGING_CONF :环境变量,指定日志过滤规则的文件,可以是相对路径或绝对路径:export QT_LOGGING_CONF=./LoggingCategory/logconfig.ini

5. QT_LOGGING_RULES :环境变量,可以设置多个规则用逗号分割:QT_LOGGING_RULES="*.debug=false;logA.loga.debug=false"

 

日志文件的过滤规则说明:

 

 

 

 

 通过以上的方法,我们设置了打开 Q_LOGGING_CATEGORY(lcQpaTablet, "qt.qpa.input.tablet") 模块的日志

运行程序查看,qt中源码 QWindowsTabletSupport类中的 qCDebug 日志都已经成功打印:

 

 

二、对于自定义的模块

 

我们在自己定义的模块中使用QLoggingCategory

1.声明头文件:#include <QLoggingCategory>

2.创建:使用宏 Q_LOGGING_CATEGORY(lCustomLog, "CustomLog")

3.设置过滤规则:QLoggingCategory::setFilterRules(QLatin1String("lCustomLog.debug=false"));

4.使用:通过qCDebug输出  qCDebug(lCustomLog) << "this is a log !";

Qt5,`QLoggingCategory::setFilterRules`用于设置日志类别(categories)的过滤规则,它允许你控制哪些日志消息应该被记录或忽略。而`QTextEdit`是一个用于显示和编辑文本的控件,可以用来显示日志信息。 要将日志信息显示到`QTextEdit`,你可以创建一个自定义的日志消息处理器,它会将日志信息输出到`QTextEdit`控件。这里是一个基本的步骤说明: 1. 创建一个继承自`QAbstractMessageHandler`(或者Qt 5.6及以上版本的`QMessageLogger`)的自定义日志处理器类。 2. 在该类重写`handleMessage`方法,以便将接收到的日志消息输出到`QTextEdit`。 3. 在你的应用程序创建`QLoggingCategory`实例,并使用`QLoggingCategory::setFilterRules`设置过滤规则。 4. 在主函数或程序初始化的地方创建`QTextEdit`实例,并设置为自定义日志处理器的消息接收器。 以下是一个简化的代码示例: ```cpp #include <QLoggingCategory> #include <QTextEdit> #include <QApplication> #include <QVBoxLayout> #include <QWidget> // 自定义日志处理器 class QTextEditLogger : public QObject { Q_OBJECT public: explicit QTextEditLogger(QTextEdit* textEdit) : m_textEdit(textEdit) {} // 重写handleMessage方法以输出日志QTextEdit void handleMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg) override { Q_UNUSED(type); Q_UNUSED(context); QString text = QString("%1: %2").arg(QDateTime::currentDateTime().toString()).arg(msg); m_textEdit->append(text); } private: QTextEdit* m_textEdit; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建QTextEdit控件 QTextEdit textEdit; QWidget window; QVBoxLayout* layout = new QVBoxLayout(&window); layout->addWidget(&textEdit); // 设置窗口大小并显示 window.resize(640, 480); window.show(); // 创建自定义日志处理器实例,并将其设置给QTextEdit QTextEditLogger logger(&textEdit); qInstallMessageHandler(logger.handleMessage); // 设置过滤规则 QLoggingCategory::setFilterRules(QStringLiteral("mycategory=true")); // 记录日志 qInfo() << "This is an info message"; qWarning() << "This is a warning message"; return app.exec(); } ``` 在这个例子,所有的日志信息都会被输出到`QTextEdit`控件。注意,`QLoggingCategory::setFilterRules`在这里用于设置只记录标识为`mycategory`的日志类别为`true`的消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值