Maison >développement back-end >C++ >Les modèles Qt peuvent-ils être enregistrés en tant que propriétés de QObjects ?
Les modèles Qt peuvent-ils être enregistrés en tant que propriétés de QObjects ?
Pour commencer, clarifions que les modèles Qt peuvent effectivement être enregistrés en tant que propriétés de QObjects en utilisant des macros. Par exemple, considérons l'AnimalModel à partir d'ici :
http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel
Passer des modèles au contexte racine
Passer des modèles au contexte racine de QuickView est une méthode simple. Voici un exemple :
QuickView view; view.rootContext()->setContextProperty("myModel", &model); // where "model" is the AnimalModel
De même, des objets enregistrés via des macros Qml peuvent être ajoutés à la vue :
view.rootContext()->setContextProperty("obj", pDataObject);
QObject avec les propriétés du modèle
Cependant, que se passe-t-il si vous souhaitez un QObject contenant un modèle de tout type de données ? Voici un exemple d'implémentation :
class DataObject : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged) ... AnimalModel m_modelAnimals; // Q_PROPERTY(AnimalModel modelAnimals READ modelAnimals NOTIFY modelAnimalsChanged) };
Contrairement au commentaire, cette inscription de propriété est bien possible, mais au lieu d'être un AnimalModel, ce sera un AnimalModel*. Tant que le modèle hérite de QAbstractListModel, vous n'avez pas besoin de la partie NOTIFY. Les modifications au sein du modèle sont automatiquement reflétées.
Mise en œuvre flexible du modèle
Une approche plus flexible consiste à créer un modèle qui stocke QObject *. À partir de QML, vous pouvez créer divers objets avec diverses propriétés et les incorporer dans le modèle. Le modèle fournit ensuite un rôle unique qui renvoie l'objet, vous permettant d'interroger et d'utiliser ses propriétés.
Modèles sans schéma
De plus, vous pouvez implémenter un Modèle « sans schéma » en utilisant QQmlListProperty et Q_CLASSINFO("DefaultProperty", "container"). Cela vous permet de composer dynamiquement le modèle ou d'utiliser la syntaxe déclarative de QML. Il est important de noter que cette approche offre également la possibilité d'ajouter ou de supprimer des objets de manière déclarative.
Exemple de modèle avec des données dynamiques
Voici un exemple d'implémentation d'un modèle qui prend en charge tout type de données :
class List : public QAbstractListModel { Q_OBJECT QList<QObject *> _data; Q_PROPERTY(int size READ size NOTIFY sizeChanged) Q_PROPERTY(QQmlListProperty<QObject> content READ content) Q_PROPERTY(QObject * parent READ parent WRITE setParent) Q_CLASSINFO("DefaultProperty", "content") public: List(QObject *parent = 0) : QAbstractListModel(parent) { } // rest of the class ... };
Ce modèle peut être utilisé pour contenir n'importe quel QObject ou classe dérivée, y compris QtObject de QML. Il peut servir de modèle pour un ListView et prend en charge le remplissage dynamique via des slots ou une syntaxe déclarative. De plus, il gère la propriété des objets et peut être imbriqué pour créer un modèle d'arborescence compartimenté.
Chargeur pour délégué
Pour afficher différents types d'objets dans une vue, vous pouvez utiliser un chargeur pour le délégué qui charge le fichier QML approprié en fonction du type de l'objet.
Tri générique et Proxy de filtrage
Pour améliorer la convivialité du modèle ci-dessus, vous pouvez également implémenter un proxy de tri et de filtrage générique simple et dynamique. Voici un exemple essentiel de mise en œuvre :
https://gist.github.com/gabor-boros/9e756b6dba5011c0286069feedbd3cc8
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!