Basic-Konzept von Qt model/view und QTableView
Ich will, eine software zu schaffen, die wird durchsuchen Sie einige Tabellen und Benutzer werden in der Lage sein, um diese zu Bearbeiten Tabellen. Nach meiner Lektüre dieses link, ich dache model/view war ein guter Ansatz, was ich brauche. Blick auf das folgende mockup :
Dies zu wissen, muss ich Fragen, um sicher zu sein, dass ich das Konzept zu verstehen. Bitte, sagen Sie meiner, wenn ich mich in die gute Richtung :
-
Ich glaube, ich muss zum erstellen einer model-Klasse für jede meiner Tabellen?
(Unterklassen QAbstractModel). Es wird wie folgt Aussehen :class citiesTableModel : public QAbstractItemModel { Q_OBJECT }
-
citiesTableModel Konstruktor holt sich die Daten aus der Tabelle
in der Datenbank?QAbstractItemModel *model = new citiesTableModel(); //model will contain 2 rows, New York and Seattle
-
Brauche ich, um eine Unterklasse QTableView für jedes andere Modell?
class citiesTableView : public QTableView{}
- Finnaly, ich denke, diese Ansicht.setData-Methode und Ansicht.setModel werden müssen
reimplementiert? setModel wird die Schleife über die einzelnen Modell-Reihen zu bauen, die
QTableView, und setData tun, die richtige Abfrage zum hinzufügen von neuen Daten in der
Modell?
Danke Ihnen sehr.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
QSqlTableModel
für diese.Als der doc sagt, es kann verwendet werden, ganz einfach:
Ja, ein Modell repräsentiert eine sql-Tabelle.
QSqlTableModel
wird es für Sie tun:Nein, tun Sie nicht. Eine einzelne
QTableview
anzeigen kann Modell, das Sie mithilfesetModel
.Je nach Strategie, die Sie Bearbeiten legen Sie mit
setEditStrategy
werden die änderungen commited, wie Sie Ihren Bearbeiten Tabellenzellen oder nach dem Einreichen Sie mitsubmitAll
.Vielleicht möchten Sie auch einen Blick auf die
QDataWidgetMapper
. Sie können Ihre Karte Modell-Daten in verschiedenen widgets und verfolgen Sie die änderungen, die Sie tun, Bearbeiten diese widgets.QDataWidgetMapper
.submitAll
soll ein Mitglied derQTableView
weil ich es nicht finden kann?bool QSqlTableModel::submitAll () [slot]
Grundsätzlich haben Sie verschiedene Möglichkeiten:
Entweder du Datenbank ist eine SQL-Datenbank. Sie können eine Unterklasse QSqlTableModel.
Andernfalls, wenn Sie möchten, erstellen Sie Ihr Modell von Grund auf, Sie haben Ihre eigenen Modell, aber ich sehe nicht den Punkt. Sie haben auch QTableModel mit einem Beispiel.
Brauchen Sie nicht, ein Modell zu erstellen, für jedes Ihrer Tabelle, denn es ist immer ein tablemodel. Das Modell meist definiert, wie Sie können hinzufügen und entfernen von Zeilen mit bestimmten Daten.
Bezug auf die Ansicht, die Sie haben, zu Erben QTableView hinzufügen, um ein benutzerdefiniertes Verhalten für Sie Zeilen und Spalten, wie drag-Ereignisse zum Beispiel.
Das einzige element der Anpassung, die Sie benötigen, ist ein Delegat für Ihre Ansicht oder nur für eine Spalte. Es wird im Grunde konvertiert einen booleschen Wert in Ihrem Modell in eine checkbox.
Ich schlage vor, Sie Blick auf SpinBox delegieren für mehr Präzision.
Hoffe, das hilft.
Edit:
Im Falle einer PostgreSQL-Sie können fügen Sie es in eine QsqlDatabase:
Übergeben Sie dann der db zu den QSqlTableModel. Wenn Sie weitere relationale operation, wie das abrufen von Feldern aus einem fremden Schlüssel, den Sie verwenden können: