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 ?

Barbara Streisand
Libérer: 2024-12-24 18:34:04
original
794 Les gens l'ont consulté

Can Qt Models Be Registered as Properties of 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
Copier après la connexion

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
Copier après la connexion

De même, des objets enregistrés via des macros Qml peuvent être ajoutés à la vue :

view.rootContext()->setContextProperty("obj", pDataObject);
Copier après la connexion

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)
};
Copier après la connexion

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 ...
};
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal