QTP0004
QML モジュールの中に QML ファイルを含むディレクトリを追加するには、qmldir ファイルを追加する必要があります。
このポリシーは Qt 6.8 で導入されました。このポリシーは Qt 6.8 で導入され、ビルドシステムが QML モジュールの QML ファイルを含む追加のディレクトリごとに追加の qmldir ファイルを生成します。
このポリシーを有効にすると、モジュール内の各QMLコンポーネントの暗黙のインポートがモジュールそのものと同じになります。つまり、モジュールを明示的にインポートしなくても、すべてのコンポーネントが相互に参照できるようになります。
このポリシーのOLD の動作は、qmldirファイルがモジュールのルートディレクトリに対してのみ生成されるというものです。
NEW このポリシーの動作は、モジュール内のQMLファイルを含む各ディレクトリに対して、別々のqmldirファイルが生成されるというものです。生成されたqmldirには、暗黙のimportをモジュールの正規のリソースの場所にリダイレクトするprefer ディレクティブが含まれています。
背景
QMLエンジンは常にQMLファイルが存在するディレクトリの暗黙のインポートを行います。モジュールのルートディレクトリにあるファイルの場合、この暗黙のインポートはモジュール自体に解決されるため、すべての兄弟コンポーネントが表示されます。しかし、QMLファイルがサブディレクトリに置かれた場合、暗黙のインポートはそのサブディレクトリに解決されます。サブディレクトリにあるコンポーネントは、import ステートメントを明示的に追加しない限り、同じモジュールにある他のコンポーネントを見ることができません。これは頻繁にエラーの原因となります。
NEW の動作では、ビルドシステムは各サブディレクトリにモジュールの正規リソースの場所を指すprefer ディレクティブを含む qmldir ファイルを生成します。これにより、モジュール内のすべてのQMLファイルを暗黙のうちにインポートすることは、モジュール自体をインポートすることと同等になり、すべてのコンポーネントはディレクトリに関係なくお互いを見つけることができるようになります。
例
QMLファイルが複数のサブディレクトリに分割されているモジュールを考えてみましょう:
qt_add_qml_module(mymodule
URI MyModule
QML_FILES
Main.qml
controls/MyButton.qml
views/MyView.qml
)よくあるニーズは、views/MyView.qml がcontrols サブディレクトリからMyButton を使用することです。OLD views/MyView.qml は暗黙的にviews サブディレクトリをインポートしているので、import MyModule を明示的に追加しない限りMyButton は見つかりません。
NEW 。 の動作では、controls とviews の両方のサブディレクトリに余分な qmldir が生成される。それぞれが暗黙のインポートをモジュールの正規のリソースの場所にリダイレクトするので、views/MyView.qml は明示的なインポートなしで、MyButton とモジュール内の他の型を使うことができます。
qt_add_qml_module() を呼び出す前に、プロジェクトで明示的にポリシーを設定することができます:
qt_policy(SET QTP0004 NEW)
あるいは、REQUIRES バージョン 6.8 以降でqt_standard_project_setup() を呼び出してください。
Qt 6.8 では、ポリシーを明示的に設定しないと警告が表示されます。
注意: ポリシーのOLD の動作は非推奨です。
qt_policy,qt_standard_project_setup(),qt_cmake_policies,qt_add_qml_moduleも参照してください 。
© 2026 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.