Model View Tutorial Part1/de: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
[http://qt.io/groups/qt_german/wiki/Model_View_Tutorial_Teil1_CdRack ← Allgemeines: Klasse CdRack]<br />[http://qt.io/groups/qt_german/wiki/Model_View_Tutorial ↑Übersicht Model/View Tutorial:CD Verwaltung↑]<br />[http://qt.io/groups/qt_german/wiki/Model_View_Tutorial_Teil2 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 [http://doc.qt.nokia.com/4.7/qabstractitemmodel.html 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 [http://qt.io/groups/qt_german/wiki/OOP-Grundlagen 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.)
==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.)
==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 [http://doc.qt.nokia.com/latest/qt.html#ItemDataRole-enum 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.
Die am meisten genutzten Werte für den Parameter role sind (In Klammern der Datentyp, der zurückgegeben wird):
{| class="infotable line"
| '''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.
==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.
[https://docs.google.com/uc?id=0B8PL33_OKajLNmE4NjNiMTMtZmZjYS00NDQyLThiZjEtMTU3MDkwZTk2YmZk&export=download&authkey=CIbe3rQK&hl=en Code für die Beispielapplikation als zip Datei zum Download] ''[docs.google.com]''

Revision as of 13:48, 24 February 2015