2012-12-30 9 views
6

Ich habe folgendes Problem:Erstellen Sie QML-Element in C++?

Ich laden eine erste Schnittstelle in eine QQuickView mit einer .qml Datei. Ich möchte dann QML types wie ein Image oder Text an die Schnittstelle mit C++ hinzufügen.

Ich weiß, dass ich vorhandene Elemente aus C++ manipulieren kann, aber wie kann ich neue Typen erstellen und hinzufügen?

Antwort

10

Leider sind die docs etwas out-of-date (verwendet Qt4 api), aber Wenn Sie Abschnitt Laden QML-Komponenten von C++ hier lesen: https://doc.qt.io/qt-4.8/qtbinding.html

Dann sollten Sie so etwas wie (mit QT5 api haben):

QQuickView view; 
view.setSource(QUrl::fromLocalFile("MyView.qml")); 
QQmlComponent component(view.engine() 
     , QUrl::fromLocalFile("MyItem.qml")); 
QObject *object = component.create(); 

Dies gibt Ihnen eine QObject aus einer .qml Datei, aber was fehlt, ist, wie dies zu der Ansicht hinzuzufügen. In qml werden Elemente nur dann gezeichnet, wenn sie an die Ansicht übergeben werden. Eine Möglichkeit, dies zu tun, ist das Element in dem Root-Kontext hinzufügen, etwa so:

QQmlProperty::write(object, "parent" 
        , QVariant::fromValue<QObject*>(view.rootObject())); 

Auch Note (wieder aus dem obigen Link): "Sie sollten immer QObject verwenden :: setProperty(), QDeclarativeProperty oder QMetaProperty :: write(), um einen QML-Eigenschaftswert zu ändern, um sicherzustellen, dass die QML-Engine über die Änderung der Eigenschaft informiert wird ".

Als nächstes müssen wir die Eigentümerschaft des Elements festlegen, andernfalls kann der JavaScript-Müllhandler Ihr Element löschen und Sie können den Fehler nach dem Zufallsprinzip sortieren.

QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); 

Schließlich müssen Sie daran denken, das Objekt "Objekt" zu löschen. Da es sich um ein QObject handelt, sollten Sie folgendes verwenden:

object->deleteLater(); 

Hoffe, das hilft jemandem!

+1

nicht vergessen zu importieren Alan

1

Go hier: http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-definetypes.html, blättern Sie nach unten und sehen „Definieren Visuelle Elemente mit dem QtQuick Module“ an Position

Dass Sie Idee gibt, wie es getan werden sollte.

Dieser Link enthält Beispiele, wie es getan werden sollte (dachte, es für Qt 4.7 geschrieben wird, aber es sollte nicht von Qt 5 viel anders sein): http://developer.nokia.com/Community/Wiki/Creating_a_custom_QML_element_with_Qt


HINWEIS: Do not vergessen zu verwenden (erben) QQuickItem Klasse statt QDeclarativeItem.