Model View Tutorial Part2 Delegate und View/de

From Qt Wiki
Revision as of 09:14, 6 February 2015 by Maintenance script (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

←Teil 2: editierbares Datenmodell
↑Übersicht Model/View Tutorial:CD Verwaltung↑
Teil 3: Zeilen / Spalten hinzufügen / entfernen→

Implementierung eines einfachen Delegates

Zum Editieren eines Modells genügt es im Einfachsten Fall, wenn die Methode flags() das Flag Qt::ItemIsEditable liefert und bei data(…) und setData(…) die Rolle Qt::EditRole implementiert ist. Um ein Datum oder einen Integer nicht in einem Textfeld sondern einem Standardeditor für den jeweiligen Datentypen zu editieren, genügt es bei data() für die Qt::EditRole das Datum nativ in den QVariant zu schreiben, und nicht in Text umgewandelt, was bei einem Datum für die Qt::DisplayRole durchaus Sinn machen kann (z.B. wenn eine spezielle Formatierung gewünscht wird).

In unserem Beispiel leiten wir von QItemDelegate ab, der dieses beschriebene Verhalten bereits implementiert. Beim Erzeugen eines eigenen Delegates muss darauf geachtet werden, dass immer, wenn es keine eigene Implementierung gibt, die Basisklasse aufgerufen wird.

Sobald aber aus dem Datentyp der Editor nicht eineindeutig bestimmt werden kann, Grenzwerte oder Validierungen (=Gültigkeitsprüfungen) benötigt werden, muss man selbst Hand anlegen: man muss einen so genannten Delegate (von QAbstractItemDelegate [doc.qt.nokia.com] abgeleitet) erstellen.

Mit einem Delegate kann man folgende Dinge machen:

  • Spezielles Editieren von Elementen in einer View
  • Spezielle Darstellung von Elementen (z.B. ein Fortschrittsbalken in einer Tabelle)
    Hier ein Beispiel aus der Qt-Dokumentation:
    aus der Qt docu

In unserem Beispiel wollen wir zum Bearbeiten der Genres eine Combo Box nutzen, mit der wir ein existierendes Genre auswählen oder ein neues eingeben können. Dazu überschreiben wir die folgenden Methoden:

createEditor

Mittels createEditor wird das Widget erzeugt, das zum Editieren benutzt werden soll. Hier können Standardwerte (wie autoComplete etc.) gesetzt werden, die üblicherweise zum Erzeugen des Widgets gehören. Bei einem Delegate muss immer der Index geprüft werden. Es kann auch ein Delegate für mehrere Views bzw. Modelle genutzt werden, daher sollte bei Zugriffen auf das Modell immer index.model oder bei setModeldata der Parameter model benutzt werden.

setEditorData

Die Methode setEditorData wird nach createEditor aufgerufen. Sie wird benutzt, um das Editor-Widget mit Daten zu füllen. In unserem Beispiel fügen wir die Genres der ComboBox hinzu und setzen den aktuell selektierten Wert.

setModelData

Die Methode setModelData wird aufgerufen, wenn das Editieren einer Zelle beendet wird. Das kann sein, weil mit der Maus woanders hingeklickt oder die Tabulator- oder Eingabetaste gedrückt wurde. Hier kann im Zweifelsfall nochmal der Wert validiert und dann ins Modell geschrieben werden. Das Beenden des Editierens (z.B. im Fehlerfall) ist hier nicht mehr möglich, da der Fokus evtl. schon woanders ist.

In unserem Beispiel fragen wir den Wert aus der ComboBox ab und schreiben ihn mittels setData ins Modell.

updateEditorGeometry

Die Methode updateEditorGeometry wird aufgerufen, um den Editor in der Tabelle korrekt zu platzieren. Die Basisklasse QItemdelegate macht bereits alles, was wir benötigen, deswegen rufen wir einfach die Basisimplementierung auf.

Ändern von Editiereigenschaften der View

Um einen Delegate in einer View zu verwenden, muss folgendes gemacht werden:

  1. Erzeugen des Delegates auf dem Heap mit new
  2. setItemdelegate [doc.qt.nokia.com] in der View aufrufen

Weiterhin kann mittels setEditTriggers [doc.qt.nokia.com] eingestellt werden, durch welche Ereignisse das Editieren einer Zelle begonnen werden soll:

Konstante Beschreibung
QAbstractItemView::NoEditTriggers kein Editieren möglich.
QAbstractItemView::CurrentChanged Das Editieren wird gestartet, wenn das aktuelle Element gewechselt wird.
QAbstractItemView::DoubleClicked Das Editieren startet mit einem Doppelklick auf ein Element.
QAbstractItemView::SelectedClicked Das Editieren wird gestartet, wenn auf ein bereits selektiertes Element geklickt wird.
QAbstractItemView::EditKeyPressed Das Editieren wird gestartet, wenn die plattformspezifische Bearbeiten-Taste gedrückt wird.
QAbstractItemView::AnyKeyPressed Das Editieren wird gestartet, wenn irgend eine Taste gedrückt wird (Außer Tab oder Cursor).
QAbstractItemView::AllEditTriggers Das Editieren wird in allen oben genannten Fällen gestartet