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 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 :
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!