Kurze Antwort
Die MVC von Qt gilt nur für eine Datenstruktur . Wenn Sie über eine MVC- Anwendung sprechen , sollten Sie nicht an QAbstractItemModel
oder denken QListView
.
Wenn Sie eine MVC-Architektur für Ihr gesamtes Programm wünschen, hat Qt kein so "riesiges" Modell- / Ansichts-Framework. Für jede Liste / jeden Datenbaum in Ihrem Programm können Sie jedoch den Qt MVC-Ansatz verwenden, für den tatsächlich ein Controller angezeigt wird. Die Daten befinden sich innerhalb oder außerhalb des Modells. Dies hängt davon ab, welchen Modelltyp Sie verwenden (eigene Modellunterklasse: wahrscheinlich innerhalb des Modells; z. B. QSqlTableModel: außerhalb (aber möglicherweise innerhalb des Modells zwischengespeichert)). Verwenden Sie zum Zusammenstellen Ihrer Modelle und Ansichten eigene Klassen, die dann die Geschäftslogik implementieren .
Lange Antwort
Qts Modell- / Ansichtsansatz und Terminologie:
Qt bietet einfache Ansichten für ihre Modelle. Sie haben einen eingebauten Controller : Das Auswählen, Bearbeiten und Verschieben von Elementen ist etwas, was ein Controller in den meisten Fällen "steuert". Das heißt, Benutzereingaben interpretieren (Mausklicks und Bewegungen) und dem Modell die entsprechenden Befehle geben.
Die Modelle von Qt sind in der Tat Modelle mit zugrunde liegenden Daten. Die abstrakten Modelle enthalten natürlich keine Daten, da Qt nicht weiß, wie Sie sie speichern möchten. Aber Sie einen QAbstractItemModel auf Ihre Bedürfnisse erweitern , indem Sie Ihre Datencontainer an die Unterklasse hinzufügen und machen das Modell Schnittstelle Ihre Daten zugreifen kann . In der Tat, und ich nehme an, dass Ihnen das nicht gefällt, besteht das Problem darin, dass Sie das Modell programmieren müssen, damit auf Daten in Ihrer Datenstruktur zugegriffen und diese geändert werden können.
In der MVC-Terminologie enthält das Modell sowohl die Daten als auch die Logik . In Qt liegt es an Ihnen, ob Sie einen Teil Ihrer Geschäftslogik in Ihr Modell aufnehmen oder nach außen stellen, um eine "Ansicht" für sich zu sein. Es ist nicht einmal klar, was unter Logik zu verstehen ist: Elemente auswählen, umbenennen und verschieben? => bereits implementiert. Berechnungen mit ihnen machen? => Platzieren Sie es außerhalb oder innerhalb der Modellunterklasse. Daten aus / in eine Datei speichern oder laden? => Fügen Sie es in die Modellunterklasse ein.
Meine persönliche Meinung:
Es ist sehr schwierig , einem Programmierer ein gutes und allgemeines MV (C) -System bereitzustellen . Da die Modelle in den meisten Fällen einfach sind (z. B. nur Zeichenfolgenlisten), bietet Qt auch ein gebrauchsfertiges QStringListModel. Wenn Ihre Daten jedoch komplexer als Zeichenfolgen sind, liegt es an Ihnen, wie Sie die Daten über die Qt-Modell- / Ansichtsschnittstelle darstellen möchten. Wenn Sie beispielsweise eine Struktur mit 3 Feldern haben (z. B. Personen mit Name, Alter und Geschlecht), können Sie die 3 Felder 3 verschiedenen Spalten oder 3 verschiedenen Rollen zuweisen. Ich mag beide Ansätze nicht.
Ich denke, das Modell- / Ansichts-Framework von Qt ist nur nützlich, wenn Sie einfache Datenstrukturen anzeigen möchten . Es wird schwierig zu handhaben, wenn die Daten benutzerdefinierte Typen haben oder nicht in einem Baum oder einer Liste (z. B. einem Diagramm) strukturiert sind. In den meisten Fällen reichen Listen aus, und selbst in einigen Fällen sollte ein Modell nur einen einzigen Eintrag enthalten. Insbesondere wenn Sie einen einzelnen Eintrag mit unterschiedlichen Attributen (eine Instanz einer Klasse) modellieren möchten, ist das Modell- / Ansichts-Framework von Qt nicht der richtige Weg, um Logik von der Benutzeroberfläche zu trennen.
Zusammenfassend denke ich, dass das Modell- / Ansichts-Framework von Qt genau dann nützlich ist, wenn Ihre Daten von einem der Viewer-Widgets von Qt angezeigt werden . Es ist völlig nutzlos, wenn Sie einen eigenen Viewer für ein Modell schreiben möchten, das nur einen Eintrag enthält, z. B. die Einstellungen Ihrer Anwendung, oder wenn Ihre Daten nicht druckbar sind.
Wie habe ich das Qt-Modell / die Qt-Ansicht in einer (größeren) Anwendung verwendet?
Ich habe einmal (in einem Team) eine Anwendung geschrieben, die mehrere Qt-Modelle zum Verwalten von Daten verwendet. Wir haben uns entschlossen, ein zu erstellen DataRole
, um die tatsächlichen Daten zu speichern, die für jede Modellunterklasse einen anderen benutzerdefinierten Typ hatten. Wir haben eine äußere Modellklasse erstellt, Model
die alle verschiedenen Qt-Modelle enthält. Wir haben auch eine äußere Ansichtsklasse erstellt, View
die die Fenster (Widgets) enthält, die mit den darin enthaltenen Modellen verbunden sind Model
. Dieser Ansatz ist also eine erweiterte Qt-MVC, die an unsere eigenen Bedürfnisse angepasst ist. Beide Model
und View
Klassen selbst haben nichts mit der Qt MVC zu tun.
Wo haben wir die Logik hingelegt ? Wir haben Klassen erstellt, die die eigentlichen Berechnungen für die Daten durchgeführt haben, indem wir Daten aus Quellmodellen gelesen haben (wenn sie sich geändert haben) und die Ergebnisse in Zielmodelle geschrieben haben. Aus Sicht von Qt wären diese Logikklassen Ansichten, da sie sich mit Modellen "verbinden" (nicht "Ansicht" für den Benutzer, sondern eine "Ansicht" für den Geschäftslogik-Teil der Anwendung).
Wo sind die Controller ? In der ursprünglichen MVC-Terminologie interpretieren Controller die Benutzereingaben (Maus und Tastatur) und geben dem Modell Befehle, um die angeforderte Aktion auszuführen. Da die Qt-Ansichten bereits Benutzereingaben wie das Umbenennen und Verschieben von Elementen interpretieren, war dies nicht erforderlich. Was wir jedoch brauchten, war eine Interpretation der Benutzerinteraktion, die über die Qt-Ansichten hinausgeht.