Model View Tutorial Part2 Delegate und View/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_Teil2 ←Teil 2: editierbares Datenmodell]<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_Teil3 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 [http://doc.qt.nokia.com/latest/qabstractitemdelegate.html 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)<br /> Hier ein Beispiel aus der Qt-Dokumentation:<br />[[Image:widgetdelegate.png|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:
# Erzeugen des Delegates auf dem Heap mit ''new''
# [http://doc.qt.nokia.com/latest/qabstractitemview.html#setItemDelegate setItemdelegate] ''[doc.qt.nokia.com]'' in der View aufrufen
Weiterhin kann mittels [http://doc.qt.nokia.com/latest/qabstractitemview.html#editTriggers-prop setEditTriggers] ''[doc.qt.nokia.com]'' eingestellt werden, durch welche Ereignisse das Editieren einer Zelle begonnen werden soll:
{| class="infotable line"
| '''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
|}

Revision as of 13:48, 24 February 2015