Wie implementiert man WPF-ähnliche MVVM in Qt / C ++ / QML?

9

Ich schreibe eine Proof-of-Concept-Anwendung, das ist sehr einfach. Im Grunde besteht es aus einer Benutzeroberfläche, in der eine Liste von "Notiz" -Typ-Objekten in einer QML-ListView angezeigt wird.

Ich habe dann ein paar Klassen, die in etwa so aussehen:

%Vor%

Dann ein Repository:

%Vor%

Endlich ein ViewModel, das Note für QML verfügbar macht

%Vor%

BITTE BEACHTEN SIE KEINE C ++ FEHLER HIER und beachten Sie, dass sie unvollständig sind, es ist nicht der Punkt in diesem Moment, da ich mich ständig daran anpasse, wie ich lerne.

Der Punkt, an dem ich kämpfe, ist, wie man ein listenähnliches Objekt QML zur Verfügung stellt. Die Voraussetzung ist, dass diese Liste dynamisch sein muss, man sollte den Text einer Notiz hinzufügen, löschen und ändern können. Wenn die Liste von C ++ geändert wird, sollte sie auch die UI (Signal) benachrichtigen.

Ich habe QQmlListProperty ausprobiert, konnte aber keine Möglichkeit finden, QML zu veröffentlichen. Dann lese ich auf einem anderen SO-Post diesen Typ kann nicht von QML (??) geändert werden, und ich stolperte über QAbstractItemModel.

Wie auch immer, kann mir jemand in die richtige Richtung zeigen?

    
Joao Milasch 06.09.2013, 01:00
quelle

1 Antwort

8

Ich habe ein ziemlich vollständiges Beispiel in eine andere Antwort .

Das allgemeine Verfahren ist:

  1. Erstellen Sie ein Modell, das von QAbstractItemModel abgeleitet ist. Sie können alle von Qt bereitgestellten Modelle erneut verwenden, z. B. QStringListModel .

  2. Zeigen Sie es QML. Z.B. Verwenden Sie setContextProperty() von rootContext() der QML Engine.

  3. Die Rollen des Modells sind im Kontext des Delegaten in QML sichtbar. Qt bietet eine Standardzuordnung zwischen Namen und Rollen für die DisplayRole ( display ) und EditRole ( edit ) in einer Standardimplementierung von roleNames() .

    %Vor%
  4. Sie können bei Bedarf Zwischenmodellmodelle erstellen, indem Sie Proxymodelle zwischen den Ansichten und den Back-End-Modellen anfügen. Sie können von QAbstractProxyModel oder einer seiner Unterklassen ableiten.

Kuba Ober 06.09.2013, 09:29
quelle

Tags und Links