Verwaltung QModelIndex

Alles rund um die Programmierung mit Qt
Antworten
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Verwaltung QModelIndex

Beitrag von stonecold »

Hallo.

Ich habe mich den ganzen Nachmittag mit dem Thema Interview und in dem Zusammenhang mit folgendem Beispiel auseinander gesetz.

SimpleDomModel

Ich dachte eigentlich, ich hätte es einigermaßen geblick und als ich nun nach dem Essen nochmal in den Code geschaut habe kam gleich wieder neue Fragen auf. Und zwar geht es um folgende Funktion (aus DomModel.cpp)

Code: Alles auswählen

QModelIndex XML_Model::index(int row, int column, const QModelIndex &parent) const
{
     XML_Item *parentItem;

     if ([b]!parent.isValid()[/b])
         [b]parentItem = rootItem[/b];
     else
         parentItem = static_cast<XML_Item*>(parent.internalPointer());

     XML_Item *childItem = parentItem->child(row);
     if (childItem)
         return createIndex(row, column, childItem);
     else
	return QModelIndex();
}
Es geht dabei um den Fettgedruckten Teil. (ich sehe gerade ist nicht ganz so fett)
!parent.isValid() Warum sollte die View (die ruft doch diese Funktion auf?) einen ungültigen Index aufrufen? Nach welchem Schema ruft sie überhaupt diese Funktion auf? Wie stellt isValid() fest, ob das Ergebnis true oder false ist? Was vergleicht die Funktion mit was?

parentItem = rootItem Woher weiß die View im Falle von parent.isValid() == false, dass sie nun einen Index auf ein Child des rootItem bekommen hat?

Viele Fragen, ich hoffe ihr könnt mir weiterhelfen!
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag von stonecold »

Vielleicht noch das.

Gehen wir davon aus, das Programm startet, und in DomModel (Klasse aus Beispiel) wird das erste Item also das RootItem erzeut. Dann wird die View ja folgende Funktion aufrufen um zu ermitteln wie viele child das rootItem hat, oder?

Code: Alles auswählen

int XML_Model::rowCount(const QModelIndex &parent) 
Aber wir kommt z.B. nun dieser erste Index "parent" zu stande?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Aus der Doku:
QModelIndex::QModelIndex ()
Creates a new empty model index. This type of model index is used to indicate that the position in the model is invalid.
Bei isValid() steht der Rest...
Woher weiß die View im Falle von parent.isValid() == false, dass sie nun einen Index auf ein Child des rootItem bekommen hat?
Sie weiß es nicht, sie prüft ob der Rückgabewert gültig ist.

Alle(!) Items haben einen Parent, und der oberste Parent ist nun mal ein ungültiger Index. Damit dein Model aber intern damit arbeiten kann, macht es aus einem ungültigem Index einen Zeiger auf eine interne Struktur.
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag von stonecold »

Hallo upsala,

Danke für die Antwort. Die Dokumentation hatte ich an dieser Stelle auch gelesen, nur sind trotzdem noch Fragen offen geblieben.

Ich befürchte, ich durchschaue die Technik noch nicht so richtig.
Ich versuche es mal zu erörtern.

Also die Geschichte beginnt zu laufen und die View ruft die Funktion index des Model auf und zwar mit row=0, column=0 und einen ungültigen QModelIndex? Wenn ja macht es das mit Absicht folgendes zu bekommen? Dann bekommt es einen QModelIndex auf das 0te child des rootItem? Damit könnte die View dann ja weiter arbeiten.

Dann stellt sich mir noch die Frage, verwaltet das Model die einzelnen Items seperat? Ich weiß nicht, ob ich es richtig ausdrücke. Also der QModelIndex besteht doch aus row, column und parent, warum werden row und column nochmal seperat beispielsweise bei Aufruf der Funktion index übergeben?

Jedes Item wird ja durch seinen parent, und row (column ist in diesem Fall ja immer = 0) beschrieben nutzt diese Struktur auch der QModelIndex? Ich habe mal versucht in der Funktion index row, column, parent.row() und parent.column() aus zu geben. Index wurde immer aufgerufen, wenn ich z.B. mit der Maus über ein Item war. parent.row() und parent.column() waren aber immer 0.

Ich weiß leider nicht wie ich es anders ausdrücken soll. In welchem Verhältnis stehen die parents mit ihren childs beschrieben durch row = 0..n und QModelIndex zueinander?

Würde mich freuen, wenn jemand Licht ins Dunkel bringt.

Gruß,
Mario
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Man kann auf 2 Arten auf eine beliebige Zelle verweisen. Entweder row, column und parent der Tabelle oder row=column=0 and parent ist die Zelle selbst (welche auch wieder eine Tabelle ist/sein kann)
Antworten