概要 - QMLとC++の統合

QMLは、C++のコードを通して簡単に拡張できるように設計されています。モジュールのクラスは Qt Qmlまた、Qt のメタオブジェクトシステムとQML エンジンが統合されているため、QML から直接 C++ の機能を呼び出すことができます。これにより、QML、JavaScript、C++のコードが混在したハイブリッドアプリケーションの開発が可能になります。

QMLとC++の統合は、以下のような様々な機会を提供します:

  • ユーザーインターフェースのコードとアプリケーションロジックのコードを分離し、前者をQML文書内のQMLとJavaScriptで実装し、後者をC++で実装する。
  • QMLからC++の機能を利用したり呼び出したりする(例えば、アプリケーションロジックを呼び出したり、C++で実装されたデータモデルを利用したり、サードパーティのC++ライブラリの関数を呼び出したりする)。
  • の機能にアクセスする。 Qt Qmlまたは Qt QuickC++ API の機能にアクセスする(例えば、QQuickImageProvider を使って動的に画像を生成する)。
  • C++から独自のQMLオブジェクト型を実装する - 特定のアプリケーション内で使用する場合でも、他の人に配布する場合でも。

C++のデータや機能をQMLに提供するには、QObject の派生クラスから利用できるようにする必要があります。QMLエンジンはメタオブジェクトシステムと統合されているため、C++型の属性をQMLに公開する で説明したように、QObject 由来のクラスのプロパティやメソッド、 シグナルにはQMLからアクセスすることができます。このようなクラスが必要な機能を提供したら、様々な方法でQMLに公開することができます:

  • クラスは インスタンス化可能な QML 型として登録し、QML コードから通常のQML オブジェクト型と同様にインスタンス化して使用することができます。
  • クラスをシングルトン型として登録し、QML のコードからそのクラスのインスタンスをインポートすることで、そのインスタンスのプロパティやメソッド、シグナルに QML からアクセスできるようにする。
  • クラスのインスタンスをコンテキストプロパティや コンテキストオブジェクトとして QML のコードに埋め込み、QML からインスタンスのプロパティやメソッド、シグナルにアクセスできるようにする。

以上が、QMLコードからC++の機能にアクセスするための最も一般的な方法です。その他のオプションや詳細については、後述の主なドキュメントページを参照してください。さらに、QMLからC++の機能にアクセスする機能とは別に Qt Qmlモジュールは、C++コードからQMLオブジェクトを操作する方法も提供しています。詳しくは「C++からQMLオブジェクトを操作する」を参照してください。

ある状態をグローバルプロパティとして QML に公開したい場合があります。C++からQMLへ状態を公開する」では、その方法について説明しています。

最後に、C++コードはスタンドアロンアプリケーションとして配布されるか、 ライブラリとして配布されるかに応じて、C++アプリケーションに統合されるか、 C++プラグインに統合されるかに分かれます。プラグインはQMLモジュールと統合され、他のアプリケーションのQMLコードにインポートして使用することができます。詳細は「C++プラグインで型と機能を提供する」を参照してください。

C++とQMLの正しい統合方法の選択

どのような統合方法が適切かを判断するには、以下のフローチャートを参考にしてください:

フローチャート中のマクロの説明については、「C++からQMLの型を定義する」 ドキュメントを参照してください。

C++クラスの属性をQMLに公開する

QML エンジンは Qt メタオブジェクトシステムと統合されているため、QML は C++ から簡単に拡張することができます。この統合により、QObject から派生したクラスのプロパティ、メソッド、シグナルに QML からアクセスすることができます。プロパティは読み込んだり変更したりすることができ、メソッドは JavaScript 式から呼び出すことができ、シグナルハンドラは必要に応じて自動的に生成されます。さらに、QObject-derived クラスの列挙値は QML からアクセス可能です。

詳しくはC++型の属性をQMLに公開するを参照してください。

C++からQMLの型を定義する

QMLの型はC++で定義し、QMLの型システムに登録することができます。これにより、C++のクラスをQMLのオブジェクト型としてインスタンス化することができ、C++で実装された独自のオブジェクト型を既存のQMLコードに組み込むことができるようになります。例えば、シングルトン型として登録することで、1つのクラスインスタンスをQMLコードからインポートできるようにしたり、インスタンス化できないクラスの列挙値をQMLからアクセスできるようにしたりすることができます。

さらに Qt Qmlモジュールは、アタッチド・プロパティやデフォルト・プロパティのような QMLの概念と統合したQML型を定義するための仕組みを提供します。

C++ から独自の QML 型を登録・作成する方法については、「C++ から QML 型を定義する」を参照してください。

コンテキスト・プロパティを使ったC++オブジェクトのQMLへの埋め込み

コンテキスト・プロパティと コンテキスト・オブジェクトを使って、 読み込まれたQMLオブジェクトのコンテキスト(またはスコープ)にC++オブジェクトや 値を直接埋め込むことができます。QQmlContext これは Qt QmlこのクラスはQMLコンポーネントのコンテキストにデータを公開し、 C++からQMLへのデータ注入を可能にします。

詳しくは「コンテキスト・プロパティを用いたC++オブジェクトのQMLへの埋め込み」を参照してください。

C++からQMLオブジェクトを操作する

QML オブジェクトは C++ からインスタンス化し、そのプロパティを参照したり、 メソッドを呼び出したり、シグナル通知を受け取ったりすることができます。これは、すべての QML オブジェクトタイプがQObject から派生したクラスを使って実装されており、 Qt メタオブジェクトシステムを通して QML エンジンがオブジェクトを動的にロードしたり、 イントロスペクトしたりすることができるためです。

警告 C++からQMLオブジェクトにアクセスし、それらを操作することは可能ですが、テストやプロトタイピングを目的とする場合を除き、推奨される方法ではありません。QMLとC++の統合の強みの一つは、C++のロジックやデータセットのバックエンドとは別に、QMLでUIを実装できることです。このようなアプローチでは、QMLのUIをC++のUIに影響を与えることなく変更することが難しくなります。

C++からQMLオブジェクトにアクセスする方法については、「C++からQMLオブジェクトを操作する」のドキュメントや、ベストプラクティスのページの「C++からQMLへデータを公開する」のセクションを参照してください。

QMLとC++間のデータ型変換

QMLとC++の間でデータのやり取りを行う場合、QMLエンジンはQMLやC++のデータ型が既知であれば、そのデータ型に変換します。

エンジンがサポートする組み込みのデータ型と、QML と C++ 間で交換される際のデータ型の変換方法については、「QML と C++ 間のデータ型変換」を参照してください。

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