概要 - QMLとC++の統合
QMLは、C++のコードを通して簡単に拡張できるように設計されています。Qt Qmlモジュールに含まれるクラスにより、C++ から QML オブジェクトを読み込んで操作することができます。また、QML エンジンと Qt のメタオブジェクトシステムとの統合により、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++の機能にアクセスするための最も一般的な方法です。その他のオプションや詳細については、後述の主なドキュメントページを参照してください。さらに、Qt Qmlモジュールでは、QML から C++ の機能にアクセスする方法とは逆に、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コードに組み込むことができるようになります。例えば、シングルトンタイプとして登録することで、単一のクラスインスタンスを QML コードからインポートできるようにしたり、インスタンス化できないクラスの列挙値を QML からアクセスできるようにしたりすることができます。
さらに、Qt Qmlモジュールでは、アタッチド・プロパティやデフォルト・プロパティといった QML の概念と統合した QML 型を定義する仕組みも提供されています。
C++ からカスタム QML 型を登録・作成する方法については、C++ から QML 型を定義するを参照してください。
コンテキスト・プロパティを使ったC++オブジェクトのQMLへの埋め込み
コンテキスト・プロパティと コンテキスト・オブジェクトを使って、 読み込まれたQMLオブジェクトのコンテキスト(またはスコープ)にC++オブジェクトや 値を直接埋め込むことができます。これは、Qt Qmlモジュールが提供するQQmlContext クラスによって実現されます。このクラスは、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エンジンがサポートする組み込み型と、QMLとC++の間でデータ型を交換する際の 変換方法については、「QMLとC++間のデータ型変換」を参照してください。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。