再利用可能なQMLモジュールの構築
以下の例では、C++をQMLに公開するライブラリの作成方法を示します。この例のディレクトリ構造は次のようになっています:
├── CMakeLists.txt └── example └── mylib ├── CMakeLists.txt ├── mytype.cpp ├── mytype.h
トップレベルのCMakeLists.txt
ファイルはqt_standard_project_setup を使って基本的なセットアップを行い、add_subdirectory
を使って mylib にあるものをインクルードします:
cmake_minimum_required(VERSION 3.16) project(qmlmodule VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 REQUIRED COMPONENTS Qml) qt_standard_project_setup(REQUIRES 6.5) add_subdirectory(example/mylib)
サブディレクトリは QML モジュールの URI に対応した構造になっていますが、ドットはスラッシュに置き換えられています。これは、エンジンがインポートパスからモジュールを検索するときに使用するロジックと同じです。このサブディレクトリ構造に従うことは、ツールの作成に役立ちます。
mytype.h
はクラスを宣言し、宣言的登録マクロを使ってそれをエンジンに公開します。
サブディレクトリのCMakeLists.txt
でqt_add_qml_module を呼び出します。QMLアプリケーションのビルドと比べると、呼び出し方が少し異なります:
qt_add_qml_module(mylib URI example.mylib VERSION 1.0 SOURCES mytype.h mytype.cpp QML_FILES MyQmlType.qml )
mylib
のターゲットはまだ作成されていません。qt6_add_qml_module
に渡されたターゲットが存在しない場合、自動的にライブラリターゲットを作成します。これにより、qt_add_libraryを別途呼び出す必要がなくなります。C++で定義されたQML型を登録するには、SOURCESパラメータに引数としてヘッダファイルとソースファイルを追加します。
プロジェクトがビルドされると、ライブラリに加えてQMLプラグインもビルドされます。プラグインの自動生成クラスはQQmlEngineExtensionPlugin を継承しています。 mylib ライブラリ自体には、型 をエンジンに登録するためのコードがすでに含まれています。しかし、これはライブラリに対してリンクできる場合にしか役に立ちません。このモジュールをqml
(QML Runtime ツール)でロードされたQMLファイルで使えるようにするには、ロード可能なプラグインが必要です。プラグインは、実際にライブラリとリンクし、型が登録されるようにする役割を担います。
プラグインの自動生成は、モジュールが型の登録以外に何もしない場合にのみ可能であることに注意してください。initializeEngine
で画像プロバイダを登録するような高度なことをする必要がある場合は、やはり手動でプラグインを書く必要があります。qt6_add_qml_moduleはNO_GENERATE_PLUGIN_SOURCE
でこれをサポートしています。
また、ディレクトリレイアウトの規約に従うことは、ツールの作成に役立ちます。このレイアウトはビルドディレクトリでも反映されます。つまり、ビルドディレクトリのパスを(-I
フラグで)QMLツールに渡せば、プラグインを見つけることができます。
© 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.