Qt QML コンパイラ

Qt QML Compiler モジュールには、Qt Quick Compilerqmllint などの QML ツールが必要とする共有機能が含まれています。また、QQmlSA フレームワークも提供しており、ツールの組み込み解析機能を拡張するために使用することができます。

モジュールの使用

Qt モジュールの C++ API を使用するには、モジュール・ライブラリを直接、または他の依存関係を通 じてリンクする必要があります。CMakeや qmakeなど、いくつかのビルドツールはこのための専用サポートを持っています。

CMake でのビルド

find_package() コマンドを使用して、必要なモジュール・コンポーネントをQt6 パッケージから探します:

find_package(Qt6 REQUIRED COMPONENTS QmlCompiler)
target_link_libraries(mytarget PRIVATE Qt6::QmlCompiler)

詳細については、CMakeによるビルドの概要を参照してください。

qmakeでのビルド

モジュールをqmakeでビルドするように設定するには、プロジェクトの.proファイルにQT 変数の値としてモジュールを追加します:

QT += QmlCompiler

QQmlSA フレームワークの使用

Qt QML Compiler モジュールでは、QML コードの静的解析ツールを提供するQQmlSA フレームワークを提供しています。これらのツールは、構文の妥当性を保証したり、QMLのアンチパターンを警告したりするのに役立ちます。QMLプログラムに静的解析を追加するには、プラグインを記述します。プラグインは、QMLコードの要素やプロパティに対して解析パスを実行します。パスはPassManagerに登録することができ、PassManagerはパスを保持し、 要素とその子要素を解析するために呼び出すことができます。パスとは、要素やプロパティに対して評価される特定のルールや条件をチェックするものです。条件が満たされた場合、パスはコード内の特定された問題をユーザーに警告し、修正を提案することもできます。パスと呼ばれるのは、要素やプロパティに対して実行される分析が、パスを連続して実行することによって行われるからです。各パスは、特定の問題を1つだけ特定する責任を負います。パスの集合を組み合わせることで、より複雑な分析を行うことができます。要素パスは、shouldRun()run() という2つの主要コンポーネントによって定義されます。解析を実行する際、パス・マネージャーはルート要素の子要素をトラバースしながら、遭遇するすべての要素に対してパスを実行します。各要素について、その要素で評価したshouldRun()true を返した場合、run() が実行されます。プロパティに対するパスは、プロパティがバインドされたとき、読み込まれたとき、書き込まれたときの3つの異なるイベントでトリガーされます。これらは、それぞれonBinding()onRead()onWrite() 関数をオーバーライドすることで実装できます。コードが大きくなるにつれて、要素とプロパティの数も増えていきます。それらすべてに対して静的解析パスを実行すると、コストが高くなる可能性があります。そのため、解析する要素やプロパティを決定する際には、粒度を細かくするのがよいでしょう。要素の場合、shouldRun() は、実際の計算を実行するrun() を実行すべきかどうかを判断するための、安価なチェックであることを意図しています。プロパティについては、マネージャにパスを登録する際に選択されます。registerPropertyPass() 関数は、引数としてmoduleNametypeNamepropertyName の文字列を取ります。これらは、登録されたパスによって影響を受けるプロパティのセットを絞り込むために使用されます。

QML Static Analysis Tutorialでは、QQmlSA フレームワークを使用して、カスタムqmllintパスを作成する方法を紹介しています。

参照

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。