8 votes

Comment exposer un modèle C++ à QML

J'écris une application QML+Qt. J'ai défini une classe comme ceci :

class MainClass : public QObject
{
    Q_OBJECT

public:
    rosterItemModel m_rosterItemModel;
.
.
.
}

rosterItemModel est une classe dérivée de QAbstractListModel. J'ai exposé MainClass à la partie qml en utilisant cette fonction :

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

Maintenant, je veux affecter ce modèle (m_rosterItemModel) de MainClass à la propriété model d'un ListView en QML. J'ai essayé les méthodes suivantes mais aucune d'entre elles n'a été utile :(

  • J'ai essayé de déclarer m_rosterItemModel comme PROPERTY en utilisant Q_PROPERTY . Je n'ai pas pu le faire car il a été dit que QAbstractListModel n'est pas copiable.
  • J'ai essayé d'obtenir un pointeur vers m_rosterItemModel dans le fichier qml en utilisant une fonction fonction Q_INVOKABLE dans MainClass. Mais cela ne m'a pas aidé non plus.

Quelqu'un pourrait-il m'aider ?

8voto

Frank Osterfeld Points 13125

Il ne devrait pas y avoir d'enregistrement de métatype nécessaire. Tout ce dont vous avez besoin est d'appeler setContextProperty et de passer le modèle par pointeur :

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

Utilisez-le en QML :

model: _rosterItemModel

Le terme "pointeur" est important, car les QObjects ne peuvent pas être copiés et le fait de les copier briserait leur sémantique de toute façon (puisqu'ils ont une "identité").

L'alternative à l'enregistrement direct du modèle est d'enregistrer l'instance de votre classe principale et d'utiliser Q_INVOKABLE. Dans MainClass :

Q_INVOKABLE RosterItemModel* rosterItemModel() const;

Enregistrement d'une instance de mainClass (mainClassInstance est à nouveau supposé être un pointeur) :

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

En QML :

model: _mainInstance.rosterItemModel()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X