CMake による統合
QMLモジュールを定義するには、CMakeコマンド `qt_add_qml_module` を使用することが推奨されます。これにより、型の登録、リソースの埋め込み、プラグインの作成、およびツールとの統合が自動化されます。このページでは、qt_add_qml_module の背後にある概念を説明し、一般的な使用パターンを順を追って解説します。
すべてのオプションに関する完全なリファレンスについては、qt_add_qml_module を参照してください。
重要な概念
例を見る前に、qt_add_qml_module が実際に何を作成するのかを理解しておくと役立ちます:
- バッキングターゲット— モジュールの C++ コード、コンパイル済みの QML ファイル、およびリソースを含むライブラリ(または実行ファイル)。これは
qt_add_qml_moduleの最初の引数であり、リンク対象となるターゲットです。既存のターゲット(qt_add_executableやqt_add_libraryで事前に作成されたもの)でもよいですし、qt_add_qml_moduleが自動的に作成することもできます。 - プラグインターゲット— QMLエンジンが実行時にモジュールを動的に読み込めるようにする小さなライブラリです。これは自動的に作成され、バッキングターゲットとは別個のものです。実行ファイルがバッキングターゲットに直接リンクする場合、プラグインは実行時に読み込まれません。NO_PLUGIN を使用することで、プラグインを完全に省略することができます。
- qmldir ファイル— モジュールが提供する型とその場所を QML エンジンに伝えるモジュールメタデータファイルです。これは自動的に生成されます。
- typeinfoファイル(
.qmltypes) — QMLツール(qmlcachegen、qmllint、qmlls、Qt Creator )で使用される、機械可読な型情報です。これも自動的に生成されます。
ディレクトリ構造
ソースディレクトリ構造は、モジュールの URI を反映する必要があります。URI は、ドットをスラッシュに置き換えることでパスに変換されます。たとえば、URI がMyCompany.Controls であるモジュールは、以下の場所に配置する必要があります:
src/MyCompany/Controls/CMakeLists.txt
src/MyCompany/Controls/Button.qml
src/MyCompany/Controls/mywidget.cpp
src/MyCompany/Controls/mywidget.hこの規約により、QMLエンジンやツールは追加の設定なしにモジュールを検出できるようになります。 ディレクトリ構造がURIと一致しない場合は、ビルド出力がURIと一致するパスに配置されるようにOUTPUT_DIRECTORYを設定し、QMLエンジンやツールがモジュールを特定できるようにIMPORT_PATHを設定する必要があります。
一般的なパターン
QMLのみのアプリケーション
最も単純なケース:QML ファイルのみで構成され、C++ 型を含まない実行ファイルです。
cmake_minimum_required(VERSION 3.16)
project(myapp LANGUAGES CXX)
find_package(Qt6 REQUIRED COMPONENTS Quick)
qt_standard_project_setup(REQUIRES 6.8)
qt_add_executable(myapp)
qt_add_qml_module(myapp
URI MyApp
QML_FILES
Main.qml
Button.qml
RESOURCES
images/logo.png
)
target_link_libraries(myapp PRIVATE Qt6::Quick)バックイングターゲットは実行ファイルであるため、プラグインは作成されません。QML ファイルはコンパイルされ、リソースとして埋め込まれます。RESOURCES キーワードを使用すると、QML ファイル以外のファイル(画像、フォントなど)を同じリソース階層に追加できます。
C++ 型を含むアプリケーション
C++型をQMLから利用可能なアプリケーション:
qt_add_executable(myapp)
qt_add_qml_module(myapp
URI MyApp
QML_FILES
Main.qml
SOURCES
backend.cpp backend.h
)backend.h 内のC++型には、QML_ELEMENT (またはQML_NAMED_ELEMENT のような類似のマクロ)による注釈が必要であり、Q_OBJECT またはQ_GADGET マクロを使用する必要があります。型の登録はAUTOMOC を通じて自動的に行われます。利用可能な登録マクロの完全な概要については、「QML型システムへのC++型の登録」を参照してください。
再利用可能なライブラリモジュール
他のプロジェクトやモジュールがインポートできる、ライブラリとしてパッケージ化された QML モジュール:
# In src/MyCompany/Controls/CMakeLists.txt
qt_add_qml_module(mycontrols
URI MyCompany.Controls
QML_FILES
Button.qml
Slider.qml
SOURCES
theme.cpp theme.h
)これにより、mycontrols (基盤となるライブラリ)とmycontrolsplugin (プラグイン)の2つのターゲットが生成されます。他のモジュールは、QML内でimport MyCompany.Controls を使用してこれをインポートします。mycontrols に直接リンクするアプリケーションでは、実行時にプラグインをロードする必要はありません。
ライブラリモジュールを使用するアプリケーション
上記の「再利用可能なライブラリモジュール」の例から、mycontrols モジュールを使用する場合:
# In the application's CMakeLists.txt
qt_add_executable(myapp)
qt_add_qml_module(myapp
URI MyApp
QML_FILES Main.qml
DEPENDENCIES TARGET mycontrols
)
target_link_libraries(myapp PRIVATE mycontrols)DEPENDENCIES行を指定することで、QML ツール(qmlcachegen、qmllint、qmlls)がMyCompany.Controls が提供する型を確実に検出できるようになります。
// In Main.qml
import MyCompany.Controls
Button { text: "Click me" }シングルトンを含むモジュール
シングルトン型を提供するQMLファイルでは、qt_add_qml_module の呼び出しの前にソースファイルプロパティを設定する必要があります:
set_source_files_properties(Theme.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
qt_add_qml_module(mymodule
URI MyModule
QML_FILES
Theme.qml
Main.qml
)また、QMLファイルにはpragma Singleton を含める必要があります。CMakeプロパティとQMLプラグマの両方が必須です。
カスタムプラグインを含むモジュール
カスタム初期化(例えば、画像プロバイダの登録など)を行う必要がある場合は、独自の `QQmlEngineExtensionPlugin ` サブクラスを提供できます。
# In CMakeLists.txt
qt_add_qml_module(mymodule
URI MyModule
NO_GENERATE_PLUGIN_SOURCE
NO_PLUGIN_OPTIONAL
CLASS_NAME MyModulePlugin
QML_FILES
Main.qml
SOURCES
myimageprovider.cpp myimageprovider.h
)
# Add the custom plugin source to the plugin target
target_sources(mymoduleplugin PRIVATE plugin.cpp)// In plugin.cpp
#include <QtQml/QQmlEngineExtensionPlugin>
#include "myimageprovider.h"
class MyModulePlugin : public QQmlEngineExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
public:
void initializeEngine(QQmlEngine *engine, const char *uri) override
{
engine->addImageProvider("myprovider", new MyImageProvider);
}
};
#include "plugin.moc"NO_GENERATE_PLUGIN_SOURCE を指定すると、ビルドシステムはデフォルトのプラグインソースを生成しないように指示されます。CLASS_NAME は、実装内のクラス名と一致している必要があります。NO_PLUGIN_OPTIONAL を指定すると、プラグインが常に読み込まれるようになります。これは、このオプションを指定しないとスキップされてしまう初期化ロジックが含まれているためです。
QMLファイルの追加
最初の `qt_add_qml_module ` の呼び出し後に追加された QML ファイルについては、`qt_target_qml_sources` を使用します:
qt_target_qml_sources(my_qml_module
QML_FILES
DynamicallyAddedType.qml
)これは、プラットフォームや設定に基づいてファイルを条件付きで含める場合に役立ちます。
CMakeの詳細リファレンス
すべての CMake コマンド、プロパティ、変数、およびポリシーに関する完全な詳細については、「QML 向けの CMake 統合」を参照してください。
「QML モジュール」、「qt_add_qml_module」、および「QML モジュールの作成」も参照してください 。
© 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.