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:
<div class="factbox right">


===Table of Content===
* [[#515e520627662fa8ff2756e30ff15d56|Ein read only (Table) Model]]
** [[#2262f69c6a73b803935283ad598f5007|rowCount]]
** [[#36a82aa80e5982c3171d42e9e6e96b6f|columnCount]]
** [[#d0e45878043844ffc41aac437e86b602|parent]]
** [[#8d777f385d3dfec8815d20f7496026dc|data]]
** [[#6a992d5529f459a44fee58c733255e86|index]]
** [[#c44d158a31dbbedb2673302bf3b4a489|headerData]]
</div>
[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:
<div class="cpp-qt geshi">
# <div class="de1">  <span class="kw2">virtual</span> <span class="kw4">int</span> rowCount<span class="br0">(</span><span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>parent <span class="sy0">=</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>]<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="kw4">const</span> <span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
# <div class="de1">  <span class="kw2">virtual</span> <span class="kw4">int</span> columnCount<span class="br0">(</span><span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>parent <span class="sy0">=</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>]<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="kw4">const</span> <span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
# <div class="de1">  <span class="kw2">virtual</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] index<span class="br0">(</span><span class="kw4">int</span> row<span class="sy0">,</span> <span class="kw4">int</span> column<span class="sy0">,</span> <span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>parent <span class="sy0">=</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>]<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
# <div class="de1">  <span class="kw2">virtual</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] parent<span class="br0">(</span><span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>child<span class="br0">)</span> <span class="kw4">const</span> <span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
# <div class="de2">  <span class="kw2">virtual</span> [http://doc.qt.io/QVariant.html <span class="kw5">QVariant</span>] data<span class="br0">(</span><span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>index<span class="sy0">,</span> <span class="kw4">int</span> role <span class="sy0">=</span> [http://doc.qt.io/Qt.html <span class="kw5">Qt</span>]<span class="sy0">::</span><span class="me2">DisplayRole</span><span class="br0">)</span> <span class="kw4">const</span> <span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
</div>
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.)
<div class="cpp-qt geshi">
# <div class="de1"><span class="kw4">int</span> CdModel<span class="sy0">::</span><span class="me2">rowCount</span><span class="br0">(</span><span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>parent<span class="br0">)</span> <span class="kw4">const</span></div>
# <div class="de1"><span class="br0">{</span></div>
# <div class="de1">    <span class="kw1">return</span> m_data.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de1"><span class="br0">}</span></div>
</div>
==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.)
<div class="cpp-qt geshi">
# <div class="de1"><span class="kw4">int</span> CdModel<span class="sy0">::</span><span class="me2">columnCount</span><span class="br0">(</span><span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>parent<span class="br0">)</span> <span class="kw4">const</span></div>
# <div class="de1"><span class="br0">{</span></div>
# <div class="de1">    <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>parent.<span class="me1">isValid</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></div>
# <div class="de1">        <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span></div>
# <div class="de2"> </div>
# <div class="de1">    <span class="kw1">return</span> m_columns.<span class="me1">count</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de1"><span class="br0">}</span></div>
</div>
==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.
<div class="cpp-qt geshi">
# <div class="de1">[http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] CdModel<span class="sy0">::</span><span class="me2">parent</span><span class="br0">(</span><span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>child<span class="br0">)</span> <span class="kw4">const</span></div>
# <div class="de1"><span class="br0">{</span></div>
# <div class="de1">    <span class="kw1">return</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>]<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de1"><span class="br0">}</span></div>
</div>
==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.
<div class="cpp-qt geshi">
# <div class="de1">[http://doc.qt.io/QVariant.html <span class="kw5">QVariant</span>] CdModel<span class="sy0">::</span><span class="me2">data</span><span class="br0">(</span><span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>index<span class="sy0">,</span> <span class="kw4">int</span> role<span class="br0">)</span> <span class="kw4">const</span></div>
# <div class="de1"><span class="br0">{</span></div>
# <div class="de1">    <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>index.<span class="me1">isValid</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></div>
# <div class="de1">        <span class="kw1">return</span> [http://doc.qt.io/QVariant.html <span class="kw5">QVariant</span>]<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de2"> </div>
# <div class="de1">    <span class="kw1">if</span><span class="br0">(</span>[http://doc.qt.io/Qt.html <span class="kw5">Qt</span>]<span class="sy0">::</span><span class="me2">DisplayRole</span> <span class="sy0">==</span> role<span class="br0">)</span></div>
# <div class="de1">    <span class="br0">{</span></div>
# <div class="de1">        <span class="kw4">const</span> CdDisk<span class="sy0">&amp;</span> rDisk <span class="sy0">=</span> m_data.<span class="me1">at</span><span class="br0">(</span>index.<span class="me1">row</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de1">        <span class="kw1">switch</span><span class="br0">(</span>index.<span class="me1">column</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></div>
# <div class="de2">        <span class="br0">{</span></div>
# <div class="de1">        <span class="kw1">case</span> <span class="nu0">0</span><span class="sy0">:</span></div>
# <div class="de1">            <span class="kw1">return</span> rDisk.<span class="me1">m_title</span><span class="sy0">;</span></div>
# <div class="de1">        <span class="kw1">case</span> <span class="nu0">1</span><span class="sy0">:</span></div>
# <div class="de1">            <span class="kw1">return</span> rDisk.<span class="me1">m_author</span><span class="sy0">;</span></div>
# <div class="de2">        <span class="kw1">case</span> <span class="nu0">2</span><span class="sy0">:</span></div>
# <div class="de1">            <span class="kw1">return</span> rDisk.<span class="me1">m_genre</span><span class="sy0">;</span></div>
# <div class="de1">        <span class="kw1">case</span> <span class="nu0">3</span><span class="sy0">:</span></div>
# <div class="de1">            <span class="kw1">return</span> rDisk.<span class="me1">m_year</span><span class="sy0">;</span></div>
# <div class="de1">        <span class="br0">}</span></div>
# <div class="de2">    <span class="br0">}</span></div>
# <div class="de1"> </div>
# <div class="de1">    <span class="kw1">return</span> [http://doc.qt.io/QVariant.html <span class="kw5">QVariant</span>]<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de1"><span class="br0">}</span></div>
</div>
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.
<div class="cpp-qt geshi">
# <div class="de1">[http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] CdModel<span class="sy0">::</span><span class="me2">index</span><span class="br0">(</span><span class="kw4">int</span> row<span class="sy0">,</span> <span class="kw4">int</span> column<span class="sy0">,</span> <span class="kw4">const</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>] <span class="sy0">&amp;</span>parent<span class="br0">)</span> <span class="kw4">const</span></div>
# <div class="de1"><span class="br0">{</span></div>
# <div class="de1">    <span class="kw1">if</span><span class="br0">(</span>parent.<span class="me1">isValid</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></div>
# <div class="de1">        <span class="kw1">return</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>]<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de2"> </div>
# <div class="de1">    <span class="kw1">if</span><span class="br0">(</span> <span class="br0">(</span><span class="nu0">0</span> <span class="sy0">&lt;=</span> row<span class="br0">)</span> <span class="sy0">&amp;&amp;</span> <span class="br0">(</span>row <span class="sy0">&lt;</span> rowCount<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">&amp;&amp;</span></div>
# <div class="de1">        <span class="br0">(</span><span class="nu0">0</span> <span class="sy0">&lt;=</span> column<span class="br0">)</span> <span class="sy0">&amp;&amp;</span> <span class="br0">(</span>column <span class="sy0">&lt;</span> columnCount<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span></div>
# <div class="de1">    <span class="br0">{</span></div>
# <div class="de1">        <span class="kw1">return</span> createIndex<span class="br0">(</span>row<span class="sy0">,</span> column<span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de2">    <span class="br0">}</span></div>
# <div class="de1">    <span class="kw1">return</span> [http://doc.qt.io/QModelIndex.html <span class="kw5">QModelIndex</span>]<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de1"><span class="br0">}</span></div>
</div>
==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.
<div class="cpp-qt geshi">
# <div class="de1">[http://doc.qt.io/QVariant.html <span class="kw5">QVariant</span>] CdModel<span class="sy0">::</span><span class="me2">headerData</span><span class="br0">(</span><span class="kw4">int</span> section<span class="sy0">,</span> [http://doc.qt.io/Qt.html <span class="kw5">Qt</span>]<span class="sy0">::</span><span class="me2">Orientation</span> orientation<span class="sy0">,</span> <span class="kw4">int</span> role<span class="br0">)</span> <span class="kw4">const</span></div>
# <div class="de1"><span class="br0">{</span></div>
# <div class="de1">    <span class="kw1">if</span><span class="br0">(</span> <span class="br0">(</span>[http://doc.qt.io/Qt.html <span class="kw5">Qt</span>]<span class="sy0">::</span><span class="me2">DisplayRole</span> <span class="sy0">==</span> role<span class="br0">)</span> <span class="sy0">&amp;&amp;</span></div>
# <div class="de1">        <span class="br0">(</span>[http://doc.qt.io/Qt.html <span class="kw5">Qt</span>]<span class="sy0">::</span><span class="me2">Horizontal</span> <span class="sy0">==</span> orientation<span class="br0">)</span> <span class="sy0">&amp;&amp;</span></div>
# <div class="de2">        <span class="br0">(</span><span class="nu0">0</span> <span class="sy0">&lt;=</span> section<span class="br0">)</span> <span class="sy0">&amp;&amp;</span></div>
# <div class="de1">        <span class="br0">(</span>section <span class="sy0">&lt;</span> columnCount<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span></div>
# <div class="de1">    <span class="br0">{</span></div>
# <div class="de1">        <span class="kw1">return</span> m_columns.<span class="me1">at</span><span class="br0">(</span>section<span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de1">    <span class="br0">}</span></div>
# <div class="de2">    <span class="kw1">return</span> [http://doc.qt.io/QVariant.html <span class="kw5">QVariant</span>]<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div>
# <div class="de1"><span class="br0">}</span></div>
</div>
[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:56, 25 February 2015

← 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:

  1.   virtual int rowCount(const QModelIndex &parent = QModelIndex()) const =0;
  2.   virtual int columnCount(const QModelIndex &parent = QModelIndex()) const =0;
  3.   virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) =0;
  4.   virtual QModelIndex parent(const QModelIndex &child) const =0;
  5.   virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const =0;

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.)

  1. int CdModel::rowCount(const QModelIndex &parent) const
  2. {
  3.     return m_data.size();
  4. }

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.)

  1. int CdModel::columnCount(const QModelIndex &parent) const
  2. {
  3.     if(!parent.isValid())
  4.         return 0;
  5.  
  6.     return m_columns.count();
  7. }

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.

  1. QModelIndex CdModel::parent(const QModelIndex &child) const
  2. {
  3.     return QModelIndex();
  4. }

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.

  1. QVariant CdModel::data(const QModelIndex &index, int role) const
  2. {
  3.     if(!index.isValid())
  4.         return QVariant();
  5.  
  6.     if(Qt::DisplayRole == role)
  7.     {
  8.         const CdDisk& rDisk = m_data.at(index.row());
  9.         switch(index.column())
  10.         {
  11.         case 0:
  12.             return rDisk.m_title;
  13.         case 1:
  14.             return rDisk.m_author;
  15.         case 2:
  16.             return rDisk.m_genre;
  17.         case 3:
  18.             return rDisk.m_year;
  19.         }
  20.     }
  21.  
  22.     return QVariant();
  23. }

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.

  1. QModelIndex CdModel::index(int row, int column, const QModelIndex &parent) const
  2. {
  3.     if(parent.isValid())
  4.         return QModelIndex();
  5.  
  6.     if( (0 <= row) && (row < rowCount()) &&
  7.         (0 <= column) && (column < columnCount()))
  8.     {
  9.         return createIndex(row, column);
  10.     }
  11.     return QModelIndex();
  12. }

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.

  1. QVariant CdModel::headerData(int section, Qt::Orientation orientation, int role) const
  2. {
  3.     if( (Qt::DisplayRole == role) &&
  4.         (Qt::Horizontal == orientation) &&
  5.         (0 <= section) &&
  6.         (section < columnCount()))
  7.     {
  8.         return m_columns.at(section);
  9.     }
  10.     return QVariant();
  11. }

Code für die Beispielapplikation als zip Datei zum Download [docs.google.com]