2017-07-07 5 views
1

によって作成されたC++クラスとクラス間の取引日の私は、次の質問は、私はloader.setSource("qmlObject.qml")コマンドにインスタンスを起動したとき、私はこのように、qmlRegisterTypeで作成objectClass(.h/.cpp)をインポートしたQML qmlObject.qmlLoader(setSource("qmlObject.qml")).QML - QmlRegisterType

を搭載したQMLのオブジェクトに関しては持っていますobjectClass(.h/.cpp)が作成されます。

私はcoreClass(.h/.cpp)という名前の他のメインクラスを持っており、objectClass(.h/.cpp)coreClass(.h/.cpp)の間でデータを交換する必要があります。

私の単純なqtアプリケーションでこの機能を実装するベストプラクティスは何ですか?

答えて

3

それを行うには二つの方法があります:C++レベルで

  1. 、両方のあなたのオブジェクトはC++オブジェクトなので、あなたが仲介としてQMLを使用してスキップして直接通信することができます。おそらくあなたのコアクラスはアプリケーション全体のクラスになるので、オブジェクトクラスのコアへの静的メンバポインタとして公開することができます。したがって、すべてのオブジェクトクラスインスタンスは、それにアクセスできます。コアクラスをQMLにコンテキストプロパティとして公開することによって、または好ましくは後者が最も効率的な方法であることから、シングルトンとして公開することにより、QMLレベルでコアクラスを公開します。次に、そのプロパティ、シグナル、およびスロット(ただし、純粋なパブリックなC++のものではありません)を、定義済みの機能インタフェースの形式で使用することができます。

最初のアプローチはパフォーマンスが向上し、メモリを少なくしますが、変更するたびにC++コードを再コンパイルする必要があります。

第2のアプローチは、対話を、呼び出し可能とマークされたプロパティ、信号、スロット、および関数であるQMLで見えるものに限定します。それは遅くなり、より多くのメモリを使用しますが、逆に、再コンパイルする必要はないので、プロトタイピングははるかに迅速です。

このようなやりとりはGUIベースで行われることが多いので、ユーザーがGUIと1秒間に何千回もやり取りしないため、オーバーヘッドは問題になりません。効率性が重要な場合は、2番目のアプローチを使用してプロトタイプを作成し、より速く実行させることができます。完了したら、コードを最初のソリューションに移植します。

また、C++とQMLの統合を行う場合、正しい方法はC++のものをQMLに公開してQMLから使用することです。あなたは決してC++からQMLの任意のものに到達する必要はありません。これは間違ったデザインの兆候です。

0

SIGNALとSLOTメカニズムを使用して、C++クラス間で簡単にデータを交換できます。 は、objectClassにcoreClassのポインタを渡し、シグナルとスロットを接続するだけです。

+0

しかし、objectClassのインスタンスは、qml Loaderから生成され、coreClassでは生成されません。 coreClassから、私はスロットとシグナルを交換する相対的なobjectClassが何か分かりません。 – daniele86

+0

私は何の意味が分からないのですか? 'instan of objectClassはqml Loaderから生成します'。 main()関数でobjectClassとcoreClassを宣言してからqmlに渡すことができます。そうすれば、お互いにポインタを渡すことができます。 –

関連する問題