Seite 1 von 1

[gelöst] QTreeView aktualisiert beim Löschen nicht richtig

Verfasst: 17. Juli 2009 07:01
von Hundefutter
Hallo zusammen.

Ich habe ein kleines Problem mit dem Einfügen und Löschen bei einem selbst definiertes Model und einer QTreeView zum Darstellen von XML-Dateien (-> verwendetes Dommodel).

Leider aktualisiert er meine TreeView nicht richtig, so dass die Veränderungen an der Daten zu Fehlern in der Anzeige führen.
Wenn ich nach dem Löschen "reset()" und "expandAll()" aufrufe, dann zeigt er mir den richtigen Baum an, jedoch ist das ja auf Dauer keine Lösung, da dann auch vorher nicht aufgeklappte Elemente aufgeklappt werden.
Rufe "beginRemoveRows()" und "endRemoveRows()" auf, sollten die die Signale nicht zur Ansicht senden?

Hier mal etwas Code:

Code: Alles auswählen

void DomModel::remove(const QModelIndex &index)
{
	DomItem* tmpItem = static_cast<DomItem*>(index.internalPointer());

	this->beginRemoveRows(index,tmpItem->row(),tmpItem->row()); // Zeilenangaben richtig?
	tmpItem->node().parentNode().removeChild(tmpItem->node());    // Zeile löschen
	
    // folgendes schon versucht, leider kein Erfolg (hat sogar manchmal zu Fehlern beim Löschen geführt)
	//tmpItem->parent()->removeChild(tmpItem->row());  	// gelöschtes Kind aus Cache (von DomItem) löschen
												
	tmpItem->parent()->clearCache(); 			// Cache (von DomItem) komplett leeren, kommt sonst zu Fehler (falsche Zeilen werden gelöscht)
	this->endRemoveRows();
}
Habe ich die Zeilenangaben bei beginRemoveRows richtig gemacht? Gebe jetzt eben die Zeile des zu löschenden Elements an..

Hoffe mal, es kennt sich jemand mit dem Thema einigermaßen aus und hat schon mal mit dem Dommodel gearbeitet (und es versucht zu erweitern)
Habe auch schon folgenden Thread gefunden: Link
Habe das dort Vorgeschlagene auch schon probiert (siehe Code), leider ohne Erfolg..

Falls ihr noch weitere Fragen zum Problem habt, schreibe diese auch bitte, dann gebe ich noch gezielt mehr Code an.

Mit freundlichen Grüßen
Hundefutter

Verfasst: 17. Juli 2009 10:49
von archer
Qt-Doku:

Code: Alles auswählen

void QAbstractItemModel::beginRemoveRows ( const QModelIndex & parent, int first, int last )  
Ich meine du müstest

Code: Alles auswählen

this->beginRemoveRows(index.parent(),tmpItem->row(),tmpItem->row());
aufrufen

Verfasst: 17. Juli 2009 11:15
von Hundefutter
Alles klar, das hat super funktioniert :).

Vielen Dank für die schnelle Antwort!

MfG
Hundefutter