Maison >développement back-end >C++ >Comment créer un modèle objet générique à utiliser dans QML ?

Comment créer un modèle objet générique à utiliser dans QML ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-28 21:22:12593parcourir

How to Create a Generic Object Model for Use in QML?

Comment créer un modèle d'objet générique à utiliser dans QML

Pour enregistrer un modèle Qt en tant que propriété d'un QObject, vous pouvez utiliser la macro Q_PROPERTY. Cependant, tous les types de modèles ne sont pas compatibles avec cette approche.

Utilisation d'AnimalModel

Bien qu'il soit courant de transmettre un QAbstractListModel directement à une vue QML, il n'est pas possible de l'enregistrer. comme propriété d'un QObject utilisant Q_PROPERTY.

Création d'une dynamique Modèle d'objet

Pour surmonter cette limitation, vous pouvez créer un QObject personnalisé qui contient des modèles de n'importe quel type de données. Prenons l'exemple suivant :

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)
};

Cela crée un QObject avec une propriété qui renvoie un pointeur vers AnimalModel. Le modèle est ensuite accessible en QML comme ceci :

DataObject {
    modelAnimals: {
        // Manipulate the model here
    }
}

Modèles sans schéma

Si vous désirez plus de flexibilité, vous pouvez créer des modèles sans schéma qui autoriser les objets avec des propriétés arbitraires. Pour y parvenir :

  1. Créez un modèle QAbstractListModel ou QObject qui stocke QObject .
  2. Fournissez un rôle d'objet unique qui renvoie l'objet.
  3. Utiliser un Loader en tant que délégué pour instancier différentes implémentations de l'interface utilisateur QML en fonction de l'objet type.
  4. Implémentez QQmlListProperty et Q_CLASSINFO("DefaultProperty", "container") pour que le modèle permette la composition dynamique à l'aide de la syntaxe déclarative de QML.

Utilisation de List

Voici un exemple de modèle de liste générique qui prend en charge divers objets types :

class List : public QAbstractListModel
{
    Q_OBJECT
    QList<QObject *> _data;

    ...
};

Vous pouvez enregistrer ce modèle en utilisant :

qmlRegisterType<List>("Core", 1, 0, "List");

Et l'utiliser dans QML comme suit :

List {
    QtObject { ... }
    QtObject { ... }
    List {
        QtObject { ... }
        QtObject { ... }
    }
}

Tri dynamique et Filtrage

Pour rendre ce modèle plus utilisable, vous pouvez mettre en place un tri et un filtrage proxy :

class SortingFilteringProxy : public QAbstractListModel
{
    Q_OBJECT
    QSortFilterProxyModel _proxy;

    ...
};

Cela permet des capacités avancées de filtrage et de tri basées sur les propriétés arbitraires des objets contenus.

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!

Déclaration:
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