Model View Tutorial Part1/de: Difference between revisions
AutoSpider (talk | contribs) (Decode HTML entity names) |
m (Wieland moved page Qt german-Model View Tutorial Teil1 to Model View Tutorial Part1/de: not english) |
Latest revision as of 12:28, 26 May 2015
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine. Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean. |
Table of Content
← Allgemeines: Klasse CdRack
↑Übersicht Model/View Tutorial:CD Verwaltung↑
Teil 2: Editieren von Werten→
Ein read only (Table) Model
In unserem Beispiel leiten wir die Model Klasse von der allgemeinsten Basisklasse für Modelle ab, von QAbstractItemModel [doc.qt.nokia.com]. QAbstractItemModel bietet für viele Funktionen (z.B. alle die zum Editieren benötigt werden) Standard-Implementierungen.
Die folgenden Methoden sind abstrakt und müssen auf jeden Fall überschrieben (und implementiert) werden:
Im folgenden werden die Methoden und ihre Implementierungen beschrieben
rowCount
Die Methode rowCount liefert die Anzahl der Zeilen (ohne die Überschrift). In unserem Beispiel ist es einfach die Anzahl der CDs in der Liste. (Wie in C++ üblich hat die erste Spalte den Index 0.)
- {
- return m_data.size();
- }
columnCount
Die Methode columnCount liefert die Anzahl der Spalten. In unserem Beispiel ist die Anzahl der Spalten fest, aber die Spaltenüberschriften sind einer QStringList gespeichert. (Wie in C++ üblich hat die erste Spalte den Index 0.)
- {
- if(!parent.isValid())
- return 0;
- return m_columns.count();
- }
parent
Die Methode parent wird für hierarchische Modelle benötigt. In unserem Beispiel liefern wir immer einen ungültigen Modell-Index. Damit erreichen wir, dass alle Elemente in einer Ebene liegen.
- {
- }
data
Die Methode data gibt die anzuzeigenden Daten zurück. Die Daten sind als QVariant typisiert. Dies ist notwendig, da sie auch für Farben und ähnliches brauchbar sein muss. Mittels des Parameters role sagt die View, wofür sie die Daten braucht. Es wird ein Wert aus Qt::ItemDataRole [doc.qt.nokia.com] übergeben. In unserem Beispiel kümmern wir uns nur um den Wert Qt::DisplayRole. Dieser wird verwendet, um Daten abzufragen, die als Hauptanzeige-Daten dienen (nicht Farbe, Schriftart, etc.), also bei uns die anzuzeigenden Texte. Es könnten aber auch Bilder (z.B. CD-Covers) sein.
- {
- if(!index.isValid())
- {
- const CdDisk& rDisk = m_data.at(index.row());
- switch(index.column())
- {
- case 0:
- return rDisk.m_title;
- case 1:
- return rDisk.m_author;
- case 2:
- return rDisk.m_genre;
- case 3:
- return rDisk.m_year;
- }
- }
- }
Die am meisten genutzten Werte für den Parameter role sind (In Klammern der Datentyp, der zurückgegeben wird):
Werte | Bedeutung |
Qt::DisplayRole | Hauptdaten, werden in Textform dargestellt. (QString) |
Qt::DecorationRole | Daten, die in Form eines Icons (üblicherweise vor den Hauptdaten) angezeigt werden sollen. (QColor, QIcon oder QPixmap) |
Qt::EditRole | Hauptdaten, allerdings so aufbereitet, das sie in einem Editor geändert werden können. (QString) |
Qt::BackgroundRole | Hintergrund, der vom benutzt wird, wenn das Element gerendert wird. (QBrush) |
Qt::ForegroundRole | Vordergrund (typischerweise die Textfarbe) die benutzt werden soll. (QBrush) |
Qt::CheckStateRole | Diese Rolle wird verwendet, um ein Kontrollkästchen vor dem Element anzuzeigen. (Qt::CheckState) |
Qt::UserRole | Mit Werten größer oder gleich diesem Wert können anwendungsspezifische Daten hinterlegt werden. |
DisplayRole und EditRole können unterschiedliche Datentypen zurückliefern, z.B. wenn ein QDate angezeigt werden soll, kann bei DisplayRole das Datum bereits in einen Text gerendert werden und bei EditRole als QDate zurückgeliefert werden. Das hat zur Folge, das die Standard Implementierung ein QDateEdit zum Editieren benutzt, und kein QLineEdit.
index
Die Methode index wird verwendet, um aus einer Zeile und einer Spalte (und bei hierarchischen Modellen dem Parent) ein gültiges QMOdelIndex-Objekt zu erzeugen. Bei komplexen (oder sehr großen) Datenmengen kann in dem QModelIndex-Objekt noch zusätzliche Informationen abgelegt werden (z.B. ein Pointer auf ein Objekt). Diese Informationen dürfen nur vom Modell ausgewertet werden.
- {
- if(parent.isValid())
- if( (0 <= row) && (row < rowCount()) &&
- (0 <= column) && (column < columnCount()))
- {
- return createIndex(row, column);
- }
- }
headerData
Die Methode headerData muss zwar nicht zwingend überschrieben werden, wird aber benötigt, wenn eine Überschrift angezeigt werden soll, die nicht aus der Spaltennummer besteht. Sinnvollerweise sollte index (section) immer auf Gültigkeit überprüft werden. Wie bei data gibt es den Parameter role. Zusätzlich gibt es orientation. Dieser Parameter wird genutzt, um zwischen horizontalem und vertikalem Header zu unterscheiden.
- {
- (0 <= section) &&
- (section < columnCount()))
- {
- return m_columns.at(section);
- }
- }
Code für die Beispielapplikation als zip Datei zum Download [docs.google.com]