Seite 1 von 1

QTreeView + QAbstractItemModel refresh()

Verfasst: 27. November 2007 16:16
von junior0007
Hallo,

ich habe Probleme beim Update eines TreeViews mit einem selbstgeschriebenen QAbstractItemModel:

Das Refresh im Model wird im Augenblick ganz einfach durch Löschen mit darauf folgenden Wiederaufbau des kompletten Model-Baums durchgeführt.
Alles ist super bis ich versuche auf ein Element des Views zu klicken... dann rauchts :-(

Ich schätze mal das ganze hängt damit zusammen, daß der View sich persistente Links zu den Model-Tree-Elementen hält. Damit hätte ich kein Problem, wenn es eine Möglichkeit gäbe diese persistenten Links upzudaten...

Bin ich so blind, daß ich die richtige Methode nicht finde? Weiss jemand rat - ein modifizieren des Model-Trees ist eigentlich zu aufwendig - da bin ich mit löschen und neuaufbauen schneller - obwohl wenn ich weiter so im dunklen tappe dann vlt auch nicht...

ich geb mal ein bißchen Code mit - vlt bin ich ja nicht nur blind sondern auch zu doof... :

in der View klasse der RefreshCallBack:

Code: Alles auswählen

void TreeView::refresh()
{
  MyDirModel* dmodel = getModel();
  dmodel->refresh();
}
im Model führt das dazu;

Code: Alles auswählen

// default Parameter QModelIndex()
void MyDirModel::refresh ( const QModelIndex & parent)
{
  // ein Signal damit läufts besser ;-)
  emit layoutAboutToBeChanged();

  // gehe rekursiv durch Baum und lösche (delete) alle Items (auch root Item)
  initDirNodes(_rootItem);

  // anlegen eines neuen DirModels
  _rootItem = new DirNode();

  // Baum aufbauen (rekursiv)	
  addChild2Item("/rootItem/Pfad", _rootItem, false);
  
  // wieder ein Signal
  emit layoutChanged();
}
Mit diesem Code wird der View geupdatet. Das einzigste Problem scheint der Update der internen Links zu sein...

Weiß jemand Rat?

Danke

Junior0007

Verfasst: 27. November 2007 16:40
von upsala
Ich glaube jetzt mal nicht, daß es an persistenten Indexes liegt. Was sagt eigentlich der Debugger dazu?

Verfasst: 4. Dezember 2007 08:50
von junior0007
Sorry fürs lange warten lassen... Musste auf Windoof umsteigen, und das hat etwas gedauert...

Also es lag durchaus an den internen Pointern. Beim Aufbau greift die View auf die Pointer zu und speichert sie. Wenn ich nu den Modeltree neu aufbaue und dem View nicht sage, daß er sich aktualisieren soll, dann zeigen natürlich alle Pointer irgendwohin nur nicht auf ViewItems...

Ein kleines

Code: Alles auswählen

emit reset()

hat das Problem erst mal gelöst.

Keine Frage das ist nicht elegant, aber fürs erste tuts ;-)