Heim >Backend-Entwicklung >C++ >Können Qt-Modelle als Eigenschaften von QObjects registriert werden?

Können Qt-Modelle als Eigenschaften von QObjects registriert werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 18:34:04799Durchsuche

Can Qt Models Be Registered as Properties of QObjects?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn