10

かなり精巧な計算の出力を表示する単純な GUI のケースを考えてみましょう。

QMLを使用して素敵なカスタム GUI を書きたいと思います。また、バックグラウンド アプリをQT C++
で作成したいと考えています。

私は QT ドキュメントの前に座っていて、
1) QML アプリケーションを作成し、何らかの形で C++ クラスをその中に埋め込む必要があるか (これは絶対に可能です)、それとも
2) C++ アプリケーション を作成し、何らかの方法で QML を埋め込む必要があるかどうかを考えています。その中のGUIと私のクラスからQMLプロパティを変更します(これも可能です)

GUI 用の QT ウィジェットを使用して、C++ ですべてを既に作成しています。GUI へのインターフェイスを書き直そうとしても、GUI を QML に移動し、C++ クラスを維持したいだけです。

考えられる答え:

以下のマークされた解決策は、C++ クラスを維持し、SIGNALS と SLOTS を介して排他的に GUI をインターフェースすることを提案しました。したがって、基本的には、メインのワーキング クラスをインスタンス化し、QML GUI を次のように表示する main.cpp になりました。

QQuickView viewer;
viewer.setSource(QUrl("./qml/main.qml"));
viewer.show();

次に、myClass を追加して、接続を行うためのオブジェクトを取得しました。

MyClass myClass;
QQuickItem* item = viewer.rootObject();
QObject::connect(item, SIGNAL(buttonClicked()), &myClass, SLOT(mySlot()));
QObject::connect(&myClass, SIGNAL(mySignal(QVariant)), item, SLOT(updateGUI(QVariant)));

C++ クラスでスロットとシグナルを実装する場合、QVariant オブジェクトを使用してデータを転送する必要があります。次に、QML ファイルは、クリックされたボタンなどの SIGNALS と、表示するデータを受け取るための SLOTS を実装します。

これはまさに私が望んでいたものです。非 GUI コードへの唯一の変更は、シグナルとスロットを介してすべての対話を行うことでした。アプリケーションで両方の GUI (QML / ウィジェット) を使用できるようになりました。

4

2 に答える 2

8

コア ロジックを C++ で記述し、それをシグナルとスロットに接続するだけで、ウィジェットや QML で同じコンポーネントを使用できます。

それはロケット科学ではなく、C++ ロジックは C++ と QML、JS ロジック (QML のみ) での使用を許可します。C++ と Qt API は、より適切なソリューションです。JS からは、Qt API のそれほど多くの機能に実際にアクセスすることはできず、QML の世界に "移植" されるメソッドはごくわずかです。ただし、すべての高性能データ コンテナーと実行パフォーマンス自体は C++ です。

結果を表示するだけでコンソールが十分でない場合は、宣言型モジュールを追加するとコンパイルが大幅に遅くなるため、QtWidgets を使用することをお勧めします。ウィジェット モジュールは現在スタンドアロンであるため、QtWidgets (Qt4 では QtGui の一部でした) でも「余分な」モジュールを追加していますが、軽量です。ウィジェットを使用してコア ロジックのプロトタイピングを行った後、QML インターフェースを実装し、それを既存のシグナル/スロット/プロパティおよびそれらを使用するバインディングに接続するだけです。

いいえ、QML を C++ クラスに埋め込むことはありません。逆です。C++ はより低レベルのレイヤーであり、QML コンポーネントの作成に使用されます。実際のインスタンス化に関しては、両方の方法を使用できますQObject。ベース クラスを QML エンジンに登録すると、それを QML でインスタンス化できます。または、C++ でクラスをインスタンス化して、QML コンテキストでのみ使用できるようにすることもできますが、それは問題ではありません。単一のオブジェクトが必要な場合は、main()関数内で C++ でインスタンス化し、それを QML コンテキストで使用できるようにすることをお勧めします。それが多くのインスタンス化を意図しているコンポーネントである場合は、QML コンポーネントを作成します。

QML で JS を使用してコア ロジックのプロトタイプを作成し、必要に応じて後で C++ に移植することもできます。2 倍の労力のように見えますが、ベッドを正しく作れば、実際には生産性が向上します。プロトタイピングは QML ではるかに高速であり、エラーの検出ははるかに安全で有益であり、API を適切に作成すれば、JS コードを移植するためです。 C++ への変換は、通常、マイナーな迷惑です。一部varの s を具象型に置き換えたり、一部.を置き換え->たり、そのようなものを使用したりします。

最終的に C++ で実行したい「精巧な計算」。計算が完了するたびに、単純にシグナルとして発行し、シグナルが接続されている任意のスロットに結果を自動的に表示できます。これは、ウィジェットまたは QML で、あるいは両方を同時に行うこともできます。

于 2013-08-13T09:48:32.787 に答える