Model View Tutorial Part2/de: Difference between revisions
No edit summary |
AutoSpider (talk | contribs) (Add "cleanup" tag) |
||
Line 1: | Line 1: | ||
{{Cleanup | reason=Auto-imported from ExpressionEngine.}} | |||
<div class="factbox right"> | <div class="factbox right"> | ||
Revision as of 16:50, 3 March 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
←Teil 1: Table Modell
↑Übersicht Model/View Tutorial:CD Verwaltung↑
Teil 2: Delegate und View→
Ein Modell, dessen Werte editiert werden können
Damit Werte in einem Modell editiert werden können, muss die Methode flags(…) überschrieben werden und für alle editierbaren Zellen auch das flag Qt::ItemIsEditable zurückliefern. Außerdem muss die Methode setData überschrieben werden, da diese von der View aufgerufen wird, um Werte in das Modell zu schreiben.
Wenn die Methode setData() überschrieben wird, muss nach dem Ändern der Werte das Signal dataChanged() explizit ausgelöst werden. Bleibt das Signal aus, dann fehlt den mit dem Modell verbundenen Views der Impuls, ihren Zustand aktualisieren.
Es sind also diese beiden virtuellen Funktionen zu überschreiben:
- Qt::ItemFlags flags(const QModelIndex& index ) const
- bool setData(const QModelIndex& index, const QVariant& value, int role)
Im folgenden wird deren Implementierungen beschrieben
flags
Die Methode flags() [doc.qt.nokia.com] wird benutzt, wenn man Eigenschaften eines Modell-Elements ändern möchte. Die am häufigsten benötigten sind:
Wert | Beschreibung |
Qt::ItemIsSelectable | Das Element kann selektiert werden (Standard). |
Qt::ItemIsEditable | Das Element kann editiert werden. |
Qt::ItemIsUserCheckable | Das Element kann (üblicherweise mittels einer Checkbox) angekreuzt werden. |
Qt::ItemIsEnabled | Der Benutzer kann mit dem Element interagieren (Standard). |
Wird für ein Element Qt::ItemIsUserCheckable zurückgegeben, wird bei setData auch die Rolle Qt::CheckStateRole übergeben.
In unserem einfachen Beispiel kann jedes Element editiert werden:
- {
- if(index.isValid())
- }
setData
Die Methode setData [doc.qt.nokia.com] wird von der View (bzw. eigentlich dem Delegate, siehe später) aufgerufen, um die Werte zu setzen. Es können all die Werte gesetzt werden, die mittels data() auch gelesen werden können. Als erstes müssen die Übergabeparameter validiert (= auf ihre Gültigkeit geprüft werden) werden. Dann muss die Rolle überprüft und die Werte im Datenmodell geändert werden. Abschließend muss das Signal dataChanged ausgelöst werden. Wird das vergessen, wird die Datenänderung nicht in der View angezeigt.
Sollte ein Editiervorgang nicht klappen, muss die Methode false zurückliefern, ansonsten true.
In unserem einfachen Beispiel verwenden wir die folgende Implementierung:
- {
- // validate the index and that row and column are inside the given borders...
- if(!index.isValid() || (m_data.size() <= index.row()) || (columnCount() <= index.column()))
- return false;
- {
- // change the value of the model
- CdDisk disk = m_data.at(index.row());
- switch(index.column())
- {
- case 0:
- disk.m_title = value.toString();
- break;
- case 1:
- disk.m_author = value.toString();
- break;
- case 2:
- disk.m_genre = value.toString();
- break;
- case 3:
- disk.m_year = value.toInt();
- break;
- }
- m_data.changeDisk(index.row(), disk);
- // don't forget to emit the signal dataChanged and to return true
- emit dataChanged(index, index);
- return true;
- }
- // in case, no editing was done, return false.
- return false;
- }
Zum Editieren muss auch die Methode data() modifiziert werden: