Login
Newsletter
Werbung

So, 2. April 2006, 00:00

Entwicklung von Applikationen in Qt 4.0, Teil 2

QModelIndex

Jedes Feld in Tabellen besitzt einen eindeutigen Index, der durch die Klasse QModelIndex repräsentiert wird. Den Index benutzen wir, wenn wir das Modell nach dem Wert des Feldes abfragen wollen (QAbstractItemModel::data()) oder den Index eines beliebigen Feldes in der Untertabelle erhalten möchten (QAbstractItemModel::index()). Um z.B. den Wert des Feldes mit den Koordinaten (3, 10) in der Wurzeltabelle zu erhalten, schreiben wir:

QModelIndex index1 = model->index(3, 10, QModelIndex());
QVariant value1 = model->data(index1);

Um dann den Wert des Feldes mit den Koordinaten (7, 12) in der Untertabelle des Feldes index1 zu erhalten, schreiben wir:

QModelIndex index2 = model->index(7, 12, index1);
QVariant value2 = model->data(index2);

Es kann auch passieren, dass das Feld index1 keine Untertabelle besitzt oder die Koordinaten (7, 12) außerhalb dieser Tabelle liegen. Dann gibt index() einen leeren Index (invalid index) zurück, was man überprüfen kann, indem man die Funktion QModelIndex::isValid() aufruft. Wir können uns also mit der Methode QAbstractItemModel::index() innerhalb der ganzen Datenstruktur bewegen.

Die Funktionen QAbstractItemModel::rowCount() und QAbstractItemModel::columnCount() geben die Anzahl von Zeilen und Spalten in der Untertabelle zurück. QAbstractItemModel::parent() gibt das Feld zurück, dass das Elternelement der Tabelle mit dem ausgewählten Index ist. Indizes geben mit Hilfe von Methoden QModelIndex::row() und QModelIndex::column() die Koordinaten des Feldes zurück, auf die sie zeigen.

QVariant

Daten in Tabellen werden durch QAbstractItemModel::data() als Objekte vom Typ QVariant zurückgegeben. Dies ist eine Container-Klasse, die in der Lage ist, eine Kopie einer einzelnen Instanz von allen primitiven, wie int, char oder double, sowie von den meisten komplexen Typen, wie QString, QColor, QSize, QFont oder sogar QList und QMap aufzubewahren. Um einen Wert in einem QVariant-Objekt zu speichern, reicht es, ihn zuzuweisen:

QString str("Hello World!");
QIcon icon("myicon.png");
QVariant v1 = str;
QVariant v2 = icon;

Um ihn dann wieder zu erhalten, sollte man zuerst überprüfen, ob QVariant den Wert des von uns erwarteten Typs besitzt. Wir machen dies mit Hilfe der Template-Funktion qVariantCanConvert(), dann lesen wir den Wert mit qVariantValue() aus:

QString str2;
if (qVariantCanConvert<QString>(v1))
 str2 = qVariantValue<QString>(v1);

Die Funktion data() nimmt neben dem Feldindex auch den Parameter role an. Dies folgt daraus, dass QAbstractItemModel neben dem Wert von jedem Feld (Qt::DisplayRole) auch das Symbol, das dabei auftaucht (Qt::DecorationRole), das Tool-Tip (Qt::ToolTipRole), die Schriftart (Qt::FontRole) sowie die Text- und Hintergrundfarbe (Qt::TextColorRole, Qt::BackgroundColorRole) bestimmen kann. In allen Fällen wird ein QVariant-Objekt zurückgegeben, das ein Objekt enthält, das für den Typ der gewünschten Information entsprechend ist, oder ein leeres QVariant, wenn die Ansicht den standardmäßigen Attributwert einsetzen soll.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung