2012-12-30 19 views
6

Ho il seguente problema:Crea elemento QML in C++?

Carico un'interfaccia iniziale in un QQuickView utilizzando un file .qml. Poi voglio aggiungere QML types come un Image o Text all'interfaccia usando C++.

So di poter manipolare elementi esistenti da C++ ma come posso creare nuovi tipi e aggiungerli?

risposta

10

Purtroppo i documenti sono un po 'out-of-date (usa Qt4 API), ma se leggete sezione Caricamento componenti QML da C++ qui: https://doc.qt.io/qt-4.8/qtbinding.html

allora si dovrebbe avere qualcosa di simile (con QT5 api):

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

questo vi dà un QObject da un file .qml, ma quello che manca è il modo per aggiungere questo alla vista. In qml, gli oggetti non verranno disegnati a meno che non siano controllati dalla vista. Un modo per farlo è quello di aggiungere l'elemento al contesto principale, in questo modo:

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

Inoltre, nota (di nuovo dal link qui sopra): "Si dovrebbe sempre usare QObject :: setProperty(), QDeclarativeProperty o QMetaProperty :: write() per modificare un valore della proprietà QML, per garantire che il motore QML venga informato della modifica della proprietà ".

Successivamente, dobbiamo impostare la proprietà dell'elemento, altrimenti il ​​gestore di spazzatura JavaScript può eliminare il tuo articolo e puoi segare l'errore casualmente.

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

Infine, è necessario ricordare di eliminare l'oggetto "oggetto". Dato che si tratta di un QObject dovresti usare:

object->deleteLater(); 

La speranza che aiuta qualcuno!

+1

non dimenticare di importare Alan

1

Vai qui: http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-definetypes.html, scorrere verso il basso e guardare voce "Definizione Elementi visivi con il modulo QtQuick"

Che ti dà un'idea di come dovrebbe essere fatto.

Questo link fornisce esempi di come dovrebbe essere fatto (pensato che è scritto per Qt 4.7, ma non dovrebbe essere molto diverso da Qt 5): http://developer.nokia.com/Community/Wiki/Creating_a_custom_QML_element_with_Qt


NOTA: Non dimenticare di utilizzare (ereditare) la classe QQuickItem anziché QDeclarativeItem.