Heim >Backend-Entwicklung >C++ >Können Qt-Modelle als Eigenschaften von QObjects registriert werden?
Können Qt-Modelle als Eigenschaften von QObjects registriert werden?
Zunächst klären wir, dass Qt-Modelle tatsächlich als Eigenschaften von QObjects registriert werden können Verwendung von Makros. Betrachten Sie zum Beispiel das AnimalModel von hier aus:
http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel
Übergabe von Modellen an den Stammkontext
Die Übergabe von Modellen an den Stammkontext von QuickView ist eine unkomplizierte Methode. Hier ein Beispiel:
QuickView view; view.rootContext()->setContextProperty("myModel", &model); // where "model" is the AnimalModel
Ähnlich können über Qml-Makros registrierte Objekte zur Ansicht hinzugefügt werden:
view.rootContext()->setContextProperty("obj", pDataObject);
QObject mit Modelleigenschaften
Was aber, wenn Sie ein QObject möchten, das ein Modell beliebiger Datentypen enthält? Hier ist eine Beispielimplementierung:
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) };
Entgegen dem Kommentar ist diese Eigenschaftsregistrierung zwar möglich, aber anstatt ein AnimalModel zu sein, wird es ein AnimalModel * sein. Solange das Modell von QAbstractListModel erbt, benötigen Sie den NOTIFY-Teil nicht. Änderungen innerhalb des Modells werden automatisch berücksichtigt.
Flexible Modellimplementierung
Ein flexiblerer Ansatz besteht darin, ein Modell zu erstellen, das QObject * speichert. Aus QML heraus können Sie vielfältige Objekte mit unterschiedlichen Eigenschaften erstellen und in das Modell integrieren. Das Modell stellt dann eine einzelne Rolle bereit, die das Objekt zurückgibt und es Ihnen ermöglicht, seine Eigenschaften abzufragen und zu nutzen.
Schemalose Modelle
Darüber hinaus können Sie a implementieren „Schemaloses“ Modell unter Verwendung von QQmlListProperty und Q_CLASSINFO(„DefaultProperty“, „Container“). Dadurch können Sie das Modell dynamisch erstellen oder die deklarative Syntax von QML verwenden. Wichtig ist, dass dieser Ansatz auch die Möglichkeit bietet, Objekte deklarativ hinzuzufügen oder zu entfernen.
Beispiel eines Modells mit dynamischen Daten
Hier ist eine Beispielimplementierung eines Modells, das alle unterstützt Datentyp:
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 ... };
Dieses Modell kann verwendet werden, um jedes QObject oder jede abgeleitete Klasse zu speichern, einschließlich QMLs QtObject. Es kann als Modell für eine ListView dienen und unterstützt die dynamische Auffüllung durch Slots oder deklarative Syntax. Darüber hinaus verwaltet es den Objektbesitz und kann verschachtelt werden, um ein unterteiltes Baummodell zu erstellen.
Loader für Delegate
Zur Anzeige verschiedener Objekttypen in einer Ansicht können Sie verwenden ein Loader für den Delegaten, der die entsprechende QML-Datei basierend auf dem Objekttyp lädt.
Generische Sortierung und Filter-Proxy
Um die Benutzerfreundlichkeit des oben genannten Modells zu verbessern, können Sie auch einen einfachen und dynamischen generischen Sortier- und Filter-Proxy implementieren. Hier ist ein Beispiel für eine Implementierung:
https://gist.github.com/gabor-boros/9e756b6dba5011c0286069feedbd3cc8
Das obige ist der detaillierte Inhalt vonKönnen Qt-Modelle als Eigenschaften von QObjects registriert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!