このページでは

QML用C++プラグインの作成

プラグインの作成

QML engine は、QML用のC++プラグインを読み込みます。このようなプラグインは通常、QML拡張モジュールとして提供され、そのモジュールをインポートするQMLドキュメント内でクライアントが利用できる型を提供することができます。モジュールが有効とみなされるには、少なくとも1つの登録済み型が必要です。

QQmlEngineExtensionPlugin は、QMLアプリケーションに動的に読み込めるQML拡張機能を作成できるプラグインインターフェースです。これらの拡張機能により、カスタムQML型をQMLエンジンで利用できるようになります。

QML拡張プラグインを作成するには:

  1. QQmlEngineExtensionPlugin をサブクラス化し、Q_PLUGIN_METADATA() マクロを使用して、Qt メタオブジェクトシステムにプラグインを登録します。
  2. QML_ELEMENT およびQML_NAMED_ELEMENT() マクロを使用して、QML 型を宣言します。
  3. ビルドファイルを設定します。

    CMake:

    qt_add_qml_module(<target>
        URI <my.import.name>
        VERSION 1.0
        QML_FILES <app.qml>
        NO_RESOURCE_TARGET_PATH
    )

    qmake:

    CONFIG += qmltypes
    QML_IMPORT_NAME = <my.import.name>
    QML_IMPORT_MAJOR_VERSION = <version>
  4. qmake を使用している場合は、プラグインを記述するためのqmldir ファイルを作成してください。なお、CMake はデフォルトでqmldir ファイルを自動的に生成します。

QML拡張プラグインは、アプリケーション固有のプラグイン、またはライブラリのようなプラグインのいずれかに使用されます。ライブラリプラグインは、型の登録に限定すべきです。エンジンのルートコンテキストを操作すると、ライブラリ利用者のコードで競合やその他の問題が発生する可能性があるためです。

注: CMakeのqt_add_qml_moduleAPIを使用する場合 、プラグインは自動的に生成されます。このAPIが型の登録を処理します。カスタム画像プロバイダの登録など、特別な要件がある場合にのみ、カスタムプラグインを記述する必要があります。その場合は、qt_add_qml_module の呼び出しにNO_GENERATE_PLUGIN_SOURCE を渡して、デフォルトのプラグインの生成を無効にしてください。

リンカーは最適化の一環として、生成された型登録関数を誤って削除してしまう可能性があります。これを防ぐには、コード内のどこかで、その関数への合成のvolatileポインタを宣言してください。この関数はqmltyperegistrar によって生成され、qml_register_types_ にモジュール URI を連結した名前が付けられ、ドットはすべてアンダースコアに置き換えられます。

モジュール名が「my.module」の場合、グローバルスコープに以下の前方宣言を追加します。

void qml_register_types_my_module();

次に、登録関数と同じバイナリに含まれる任意の関数の実装に、以下のコードスニペットを追加します:

volatile auto registration = &qml_register_types_my_module;
Q_UNUSED(registration);

参考

© 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.