QML Statische Analyse 1 - Grundlegende Einrichtung
In diesem Kapitel wird die grundlegende Struktur eines qmllint-Erweiterungs-Plugins vorgestellt und wie es mit qmllint verwendet werden kann.
Um unser Plugin zu erstellen, müssen wir zunächst das Modul QmlCompiler verfügbar machen:
find_package(Qt6 REQUIRED COMPONENTS QmlCompiler)
Dann erstellen wir ein Plugin und verknüpfen es mit dem QmlCompiler-Modul.
qt_add_plugin(HelloWorldPlugin) target_sources(HelloWorldPlugin PRIVATE helloplugin.h helloplugin.cpp ) target_link_libraries(HelloWorldPlugin PRIVATE Qt::QmlCompiler)
Die Implementierung folgt dem Muster für die Erweiterung von Qt mit einem Plugin: Wir subclassifizieren die 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; };
Das Plugin referenziert eine plugin.json
Datei, die einige wichtige Informationen enthält:
{ "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
und description
sind Metadaten, die das Plugin beschreiben.
Jedes Plugin kann eine oder mehrere Protokollierungskategorien haben, die verwendet werden, um Warnungen thematisch zu gruppieren. loggingCategories
nimmt ein Array von Kategorien, die jeweils bestehen aus
name
die zur Identifizierung der Kategorie und als Flag-Name in qmllint verwendet wird,settingsName
, die zur Konfiguration der Kategorie in qmllint.ini verwendet wirddescription
die beschreiben soll, welche Art von Warnmeldungen mit der Kategorie gekennzeichnet werden
In unserem Beispiel haben wir nur eine Protokollierungskategorie, hello-world
. Für jede Kategorie müssen wir ein LoggerWarningId Objekt in unserem Plugin erstellen.
static constexpr QQmlSA::LoggerWarningId helloWorld { "Plugin.HelloWorld.hello-world" };
Wir konstruieren es mit einem String-Literal, das das Format Plugin.<plugin name>.<category name>
haben sollte.
Damit unser Plugin überhaupt etwas Nützliches tun kann, müssen wir die Funktion registerPasses
implementieren.
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; // Überspringen Sie die Registrierung, wenn das Plugin ohnehin deaktiviert ist // hier werden wir später unsere Pässe registrieren}
Wir prüfen, ob unsere Kategorie aktiviert ist, und geben eine Diagnose aus, die ihren Status über qDebug anzeigt. Beachten Sie, dass das Plugin derzeit nichts Nützliches tut, da wir keine Pässe registrieren. Dies wird im nächsten Teil des Tutorials nachgeholt.
Wir können jedoch bereits überprüfen, ob unser Plugin korrekt erkannt wird. Wir verwenden den folgenden Befehl, um dies zu überprüfen:
qmllint -P /path/to/the/directory/containing/the/plugin --Plugin.HelloWorld.hello-world info test.qml
Mit den Optionen -P
wird qmllint angewiesen, im angegebenen Ordner nach Plugins zu suchen. Um Konflikte mit Qt-internen Kategorien zu vermeiden, werden Plugin-Kategorien immer mit "Plugin" vorangestellt, gefolgt von einem Punkt, dem Plugin-Namen, einem weiteren Punkt und schließlich der Kategorie. Die Ausführung des Befehls sollte Hello World Plugin is enabled
ausgeben.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.