QML静态分析1 - 基本设置
本章介绍了qmllint扩展插件的基本结构,以及如何与qmllint一起使用。
要创建我们的插件,我们首先需要使QmlCompiler模块可用
find_package(Qt6 REQUIRED COMPONENTS QmlCompiler)
然后创建一个插件,并将其链接到QmlCompiler模块。
qt_add_plugin(HelloWorldPlugin) target_sources(HelloWorldPlugin PRIVATE helloplugin.h helloplugin.cpp ) target_link_libraries(HelloWorldPlugin PRIVATE Qt::QmlCompiler)
实现遵循扩展Qt的插件模式:通过插件扩展Qt:我们子类了QQmlSA::LintPlugin,
class HelloWorldPlugin : public QObject, public QQmlSA::LintPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID QmlLintPluginInterface_iid FILE "plugin.json") Q_INTERFACES(QQmlSA::LintPlugin) public: void registerPasses(QQmlSA::PassManager *manager, const QQmlSA::Element &rootElement) override; };
插件引用了一个plugin.json
文件,其中包含一些重要信息
{ "name": "HelloWorld", "author": "Qt Example", "description": "Demonstrates how to write a qmllint plugin", "version": "1.0", "loggingCategories": [ { "name": "hello-world", "settingsName": "HelloWorld", "description": "Used to create test messages" } ] }
name
,author
,version
和description
是描述插件的元数据。
每个插件可以有一个或多个日志分类,它们用于主题性地分组警告。loggingCategories
接受一个分类数组,每个分类由以下内容组成
name
,用于标识分类,并在qmllint中作为标志名称使用settingsName
,用于在qmllint.ini中配置分类description
,应描述与该分类标记的警告消息类型
在我们的例子中,我们只有一个日志分类,hello-world
。对于每个分类,我们在我们的插件中必须创建一个LoggerWarningId对象。
static constexpr QQmlSA::LoggerWarningId helloWorld { "Plugin.HelloWorld.hello-world" };
我们用字符串字面量构造它,该字面量应具有格式Plugin.<插件名称>.<分类名称>
。
最后,为了使我们的插件真正有用,我们必须实现registerPasses
函数。
void HelloWorldPlugin::registerPasses(QQmlSA::PassManager *manager, const QQmlSA::Element &rootElement) { const bool pluginIsEnabled = manager->isCategoryEnabled(helloWorld); qDebug() << "Hello World plugin is" << (pluginIsEnabled ? "enabled" : "disabled"); if (!pluginIsEnabled) return; // skip registration if the plugin is disabled anyway // here we will later register our passes }
我们检查我们的分类是否启用,并通过qDebug打印出一个表示其状态的诊断信息。请注意,当前的插件还没有做什么有用的事情,因为我们没有注册任何Pass。这将在本教程的下一部分完成。
但是,我们可以验证我们的插件是否已被正确检测。我们使用以下命令进行检查
qmllint -P /path/to/the/directory/containing/the/plugin --Plugin.HelloWorld.hello-world info test.qml
-P
选项告诉qmllint在指定的文件夹中查找插件。为了避免与Qt内部分类冲突,插件分类始终以"Plugin"开头,然后跟一个点,插件名称,另一个点和该分类。运行该命令应打印出Hello World Plugin is enabled
。
© 2024 The Qt Company Ltd. 嵌入本文档的内容均为各自所有者的版权。本提供的文档根据自由软件基金会发布的条款,受GNU自由文档许可证版本1.3 许可。Qt及其相关标志是芬兰及/或其他国家/地区The Qt Company Ltd.的商标。商标。其他所有商标归其各自所有者所有。