2012-12-30 21 views
6

私は次の問題があります:ファイルを使用してQQuickViewに初期インターフェイスをロードします。 次に、ImageまたはTextのようなQML typesをC++を使用してインターフェイスに追加したいとします。C++でQML要素を作成しますか?

私はC++から既存の要素を操作できますが、新しい型を作成して追加するにはどうすればよいですか?

答えて

10

残念ながら、ドキュメントが最新ビット(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(); 

誰かを助けることを望みます!

+1

インポートを忘れて Alan

1

ここに行く: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クラスを使用します。

関連する問題