2012-08-04 17 views
6

Ich schreibe eine QML + Qt-Anwendung. I definiert eine Klasse wie folgt:So stellen Sie ein C++ - Modell für QML bereit

class MainClass : public QObject 
{ 
    Q_OBJECT 

public: 
    rosterItemModel m_rosterItemModel; 
. 
. 
. 
} 

rosterItemModel Modell ist eine Klasse von QAbstractListModel abgeleitet. ich ausgesetzt Mainclass Teil QML diese Funktion verwenden:

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

Jetzt habe ich dieses Modell zugewiesen werden soll (m_rosterItemModel) von Mainclass-Eigenschaft eines Listview in QML zu modellieren. Ich habe versucht, die folgenden Möglichkeiten, aber keiner von ihnen waren hilfreich :(

  • Ich versuchte m_rosterItemModel als PROPERTY Q_PROPERTY mit zu erklären. Ich konnte es nicht tun, weil sie sagte, dass QAbstractListModel nicht copy-fähig ist.
  • ich habe versucht, einen Zeiger auf m_rosterItemModel in QML-Datei mit einer Q_INVOKABLE Funktion in Mainclass zu bekommen. Aber es war zu nicht hilfreich.

Könnte mir jemand helfen?

Antwort

6

Es sollte keine Metatyp-Registrierung notwendig sein. Alles was Sie brauchen, ist setContextProperty anrufen und das Modell von Zeiger passieren:

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

Verwenden Sie es in QML:

model: _rosterItemModel 

Durch Zeiger ist wichtig, da QObject die sind nicht kopier konstruierbar und Sie zu kopieren, würde ihre Semantik sowieso zerstören (da sie eine "Identität" haben).

Die Alternative zur direkten Registrierung des Modells besteht darin, die Instanz Ihrer Hauptklasse zu registrieren und Q_INVOKABLE zu verwenden. In Mainclass:

Q_INVOKABLE RosterItemModel* rosterItemModel() const; 

Registrieren einer Instanz von Mainclass (mainClassInstance wieder angenommen wird, einen Zeiger zu sein):

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

in QML:

model: _mainInstance.rosterItemModel() 
+0

I Mainclass zu QML Verwendung qmlRegisterType registriert in Um MainClass-Signale und Slots einfach in QML zu verwenden, erstellen Sie eine Instanz wie MainClass {id: mc}. Sowieso . danke :) – saeed

+2

Es scheint, aus Erfahrung, dass im zweiten Fall die Modellklasse in necassary auch registrieren: 'qmlRegisterType (" CPPIntegrate ", 1, 0," MainClass ");' Auch mit 'const' Modifier scheint die Interoperation zu unterbrechen. Das letzte schrullige Bit bezieht sich immer auf die Klasse mit ihrer vollständigen Namespace-Qualifizierung innerhalb der Header-Deklarationen Q_PROPERTY und Q_INVOKABLE. Wenn man außerdem versucht, einen Basisklassenzeiger (wie QAbstractItemModel) zurückzugeben, wird die Interoperabilität erneut fehlschlagen, also Vorsicht. – mlvljr

+0

Wie bekomme ich mainClassInstance? – Brent81

Verwandte Themen