私は次の問題があります:ファイルを使用してQQuickView
に初期インターフェイスをロードします。 次に、Image
またはText
のようなQML typesをC++を使用してインターフェイスに追加したいとします。C++でQML要素を作成しますか?
私はC++から既存の要素を操作できますが、新しい型を作成して追加するにはどうすればよいですか?
私は次の問題があります:ファイルを使用してQQuickView
に初期インターフェイスをロードします。 次に、Image
またはText
のようなQML typesをC++を使用してインターフェイスに追加したいとします。C++でQML要素を作成しますか?
私はC++から既存の要素を操作できますが、新しい型を作成して追加するにはどうすればよいですか?
残念ながら、ドキュメントが最新ビット(Qt4をAPIを使用しています)ですが、あなたはここにC++からQMLコンポーネントのロードセクションを読めば:https://doc.qt.io/qt-4.8/qtbinding.html
次にあなたがQt5 APIと(のようなものを持っている必要があります):
QQuickView view;
view.setSource(QUrl::fromLocalFile("MyView.qml"));
QQmlComponent component(view.engine()
, QUrl::fromLocalFile("MyItem.qml"));
QObject *object = component.create();
これは、.qmlファイルからQObjectを取得しますが、欠落しているのはビューにこれを追加する方法です。 qmlでは、ビューにペアレント化されていない限り、アイテムは描画されません。
またQQmlProperty::write(object, "parent"
, QVariant::fromValue<QObject*>(view.rootObject()));
、ノートを(再度、上記のリンクから):これを行う方法の1つはそうのように、ルートコンテキストにアイテムを追加することです」あなたは常に使用する必要があるのQObject :: setPropertyを()、QDeclarativeProperty QMLエンジンがプロパティの変更 "を認識するように、QMLプロパティ値を変更するQMetaProperty :: write()を呼び出します。
次に、アイテムの所有権を設定する必要があります。そうしないと、JavaScriptのガベージハンドラがアイテムを削除し、ランダムにエラーを分類できます。
QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
最後に、オブジェクト「オブジェクト」を忘れずに削除する必要があります。 QObjectのため、次のように使用してください。
object->deleteLater();
誰かを助けることを望みます!
ここに行く:http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-definetypes.html、一番下までスクロールし、「QtQuickモジュールとのビジュアル項目を定義する」という見出しを見て
あなたにそれが行われるべきかアイデアを提供します。
このリンクは、それが(それはQtの4.7用に書かれていると思ったが、それはQtの5異なるあまりすべきではない)に行われるべきかの例を提供します:http://developer.nokia.com/Community/Wiki/Creating_a_custom_QML_element_with_Qt
注:をしないでください使用することを忘れないでください(継承)QDeclarativeItemの代わりにQQuickItemクラスを使用します。
インポートを忘れて –
Alan