2012-08-04 23 views
6

Estoy escribiendo una aplicación QML + Qt. he definido una clase como esta:Cómo exponer un modelo C++ a QML

class MainClass : public QObject 
{ 
    Q_OBJECT 

public: 
    rosterItemModel m_rosterItemModel; 
. 
. 
. 
} 

modelo rosterItemModel es una clase derivada de QAbstractListModel. expuse MainClass a QML parte de usar esta función:

qmlRegisterType<MainClass>("CPPIntegrate", 1, 0, "MainClass"); 

Ahora desea asignar este modelo (m_rosterItemModel) de MainClass para modelar la propiedad de un ListView en QML. probé las siguientes maneras pero ninguno de ellos eran útiles :(

  • Me trataron de declarar m_rosterItemModel como una propiedad utilizando Q_PROPERTY. que no podía hacer eso porque dice que no es QAbstractListModel copia-poder.
  • me trataron de obtener un puntero a m_rosterItemModel en el archivo QML usando una función Q_INVOKABLE en MainClass. Pero no fue útil también.

Podría alguien ayudarme?

Respuesta

6

No debe haber ningún registro de metatipo necesario. Todo lo que necesita es llamar setContextProperty y aprobar el modelo de puntero:

QQmlContext* context = view->rootContext(); //view is the QDeclarativeView 
context->setContextProperty("_rosterItemModel", &mainClassInstance->m_rosterItemModel); 

utilizarlo en QML:

model: _rosterItemModel 

Por puntero es importante, ya que QObject de que no son copiar-construible y copiarlos rompería su semántica de todos modos (ya que tienen una "identidad").

La alternativa para registrar el modelo directamente es registrar la instancia de su clase principal y usar Q_INVOKABLE. En MainClass:

Q_INVOKABLE RosterItemModel* rosterItemModel() const; 

Registro de una instancia de MainClass (mainClassInstance de nuevo se asume que es un puntero):

context->setContextProperty("_mainInstance", mainClassInstance); 

En QML:

model: _mainInstance.rosterItemModel() 
+0

Me he registrado MainClass a QML usando qmlRegisterType en Para usar señales y ranuras MainClass fácilmente en QML creando una instancia de este como MainClass {id: mc}. De todas formas . gracias :) – saeed

+2

Parece, por experiencia, que en el segundo caso también se registra la clase de modelo en necassary: ​​'qmlRegisterType (" CPPIntegrate ", 1, 0," MainClass ");' También, usando 'const' el modificador parece romper la interoperación. El último bit peculiar es referirse siempre a la clase con su calificación completa del espacio de nombres dentro de las declaraciones Q_PROPERTY y Q_INVOKABLE del encabezado. Además, si se intenta devolver algún puntero de clase base (como QAbstractItemModel), la interoperabilidad volverá a fallar, así que ten cuidado. – mlvljr

+0

¿Cómo obtener mainClassInstance? – Brent81

Cuestiones relacionadas