QLoggingCategory类使用
QLoggingCategory的概述
- QLoggingCategory是Qt的日志策略类;可以通过声明不同的日志策略对象来输出不同的日志信息。打印信息类型如下:
- 宏 Q_DECLARE_LOGGING_CATEGORY(name) 定义一个返回QLoggingCategory对象函数,定义源码如下:
#define Q_DECLARE_LOGGING_CATEGORY(name) \const QLoggingCategory &name();
- 宏 Q_LOGGING_CATEGORY(name, string) 是宏Q_DECLARE_LOGGING_CATEGORY定义函数的实现,定义源码如下:
#define Q_LOGGING_CATEGORY(name, ...) \const QLoggingCategory &name() \{ \static const QLoggingCategory category(__VA_ARGS__); \return category; \}
4.在QLoggingCategory中,可以通过使用setFilterRules()函数来控制日志策略开启和关闭;其规则满足正则表达时,对于多个规则使用如下代码:
//test.cat.debug=false 设置test.cat 的 debug类型关闭,即 qCDebug(testCat)的打印不在输出;多个日志策略之间需要加"\n"作为结束符
QLoggingCategory::setFilterRules("qt.scenegraph.renderloop.debug=true\n" "test.cat.debug=false");
5.常用的一些日志策略:
qt.quick.image: 在QQuickPixmapcache 和图片缓存处理相关的日志输出
qt.scenegraph.* 和 QQuick 的scene graph 相关的日志输出
qt.qpa.* 和 Qt Platform 相关的 日志输出
QLoggingCategory 实例代码
//QLoggingCategory使用:
//step1 使用宏 Q_DECLARE_LOGGING_CATEGORY() 声明一个日志策略对象
//step2 使用宏 Q_LOGGING_CATEGORY() 创建一个日志策略对象
//step3 使用qCDebug(日志策略name)<<“打印内容” 输出需要调试信息
//step4 通过设置日志策略message类型的enable状态,来控制是否使能调试信息输出;
//此宏是一个函数声明函数
Q_DECLARE_LOGGING_CATEGORY(testCat)//此宏是一个函数实现宏
Q_LOGGING_CATEGORY(testCat, "test.cat");void testCategory() {qCDebug(testCat) << "testCat qCDebug()";qCWarning(testCat) << "testCat qCWarning()";
}int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN) && QT_VERSION_CHECK(5, 6, 0) <= QT_VERSION && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifqputenv("QSG_INFO", "true");QGuiApplication app(argc, argv);//test.cat.debug=false 来屏蔽qCDebug(testCat) 的打印//qt.scenegraph.renderloop.debug=true 使能 qml 渲染循环的debug 打印QLoggingCategory::setFilterRules("qt.scenegraph.renderloop.debug=true\n" "test.cat.debug=false"); QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);testCategory();QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/qt/qml/testqml/main.qml")));if (engine.rootObjects().isEmpty())return -1;QObject* rootObject = engine.rootObjects().first();QQuickWindow* window = qobject_cast<QQuickWindow*>(rootObject);if (window) {qDebug() << "Successfully retrieved QQuickWindow:" << window;}return app.exec();
}