2016-05-19 29 views
0

Ich habe ein QTreeView mit meinem eigenen Modell. Beim Hinzufügen neuer Elemente in den Baum werden einige Elemente erweitert oder reduziert. Wie kann ich den Erweiterungsstatus beim Ändern des Baums beibehalten?QTreeView mit QAbstractItemModel: Baumelemente reduzieren und erweitern, wenn neue Kinder hinzugefügt/aktualisiert werden

Danke, Martin.

+0

Wie ändern Sie Ihren Baum? –

+0

Ich rufe beginInsertRows auf (QModelIndex(), iRow, iRow); dann aktualisiere ich Daten und schließlich endInsertRows(); – MPeli

+1

Ok ... könnten Sie Code zeigen? –

Antwort

0

Ich möchte etwas Code teilen, aber es ist zu lang. Ich werde erklären, wo mein Problem war.

Das ist meine Baumstruktur

enter image description here

Es ist notwendig, folgende Funktionen zu verwenden, wenn das Einfügen/Löschen von Zeilen.

void QAbstractItemModel::beginInsertRows(const QModelIndex & parent, int first, int last); 
void QAbstractItemModel::endInsertRows() 

void QAbstractItemModel::beginRemoveRows(const QModelIndex & parent, int first, int last) 
void QAbstractItemModel::endRemoveRows() 

ich herausgefunden, wenn Elemente A und C Einfügen/Löschen ist es erforderlich, ungültig Modellindex als Eltern-Index zu verwenden. Ein ungültiger Modellindex ist QModelIndex() ohne Parameter. Zumindest hilft es mir in meinem Fall.

Ein einfaches Baummodell Beispiel ist hier verfügbar: http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html

0

Es ist ziemlich spät für die Autor Frage, aber ich hatte ein ähnliches Problem und hier gelandet, vielleicht ist es wert, eine Lösung Posting kam ich mit.

Mein Verständnis ist, dass das Aktualisieren von Knoten kein Problem ist - Indizes werden nicht ungültig gemacht und die Erweiterung wird beibehalten. Wenn Sie jedoch einen neuen Knoten hinzufügen, scheint der Standardwert zu sein, dass der Knoten minimiert wird. Die Brache kleine Hack ändert die Standard alle neu hinzugefügten Indizes zu erweitern:

// This is done at the point where the model is set to be used by the view 
connect(&model, &QAbstractItemModel::rowsInserted, 
     [&](const QModelIndex &parent, int first, int last) { 
      for (; first <= last; ++first) { 
      tree_view->expand(
       model.index(first, 0, parent)); 
      } 
     }); 

Falls Sie einen Knoten mit einer neuen Version ersetzt werden soll (es entfernen und ein neues an seiner Stelle hinzufügen) Sie ein ähnliches verwenden können Ansatz: Erinnere dich an die Erweiterung, indem du dich an QAbstractItemModel::rowsAboutToBeRemoved anschließt und QTreeView::isExpanded() verwendest. Der Zustand kann in einer Funktion/Steckplatz, der mit QAbstractItemModel::rowsInserted verbunden ist, gespeichert werden.