2016-05-19 2 views
0

У меня есть QTreeView с моей собственной моделью. При добавлении новых элементов в дерево некоторые элементы расширяются или сворачиваются. Как сохранить состояние расширения при изменении дерева?QTreeView с QAbstractItemModel: элементы дерева сворачиваются и расходуются при добавлении/обновлении новых детей

спасибо, Martin.

+0

Как вы изменяете свое дерево? –

+0

Я вызываю beginInsertRows (QModelIndex(), iRow, iRow); затем я обновляю данные и, наконец, вызываю endInsertRows(); – MPeli

+1

Хорошо ... Вы могли бы показать какой-то код? –

ответ

0

Я хотел бы поделиться некоторым кодом, но он слишком длинный. Я объясню, где была моя проблема.

Это мое дерево структура

enter image description here

Необходимо использовать следующие функции при вставке/удалении строк.

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() 

Я обнаружил, что при вставке/удалении элементов A и C, то необходимо использовать неправильный индекс модели в качестве родительского индекса. Недопустимый индекс модели - QModelIndex() без каких-либо параметров. По крайней мере, это то, что помогает в моем случае.

Простое дерево модели пример можно найти здесь: http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html

0

Это довольно поздно для автора на вопрос, но у меня была аналогичная проблема, и в конечном итоге здесь, так что, возможно, стоит вывешивать решение, которое я придумал.

Я понимаю, что обновление узлов не является проблемой - индексы не являются недействительными и расширение сохраняется. Однако, когда вы добавляете новый узел, по умолчанию создается попытка свертывания узла. Парование небольшой хак изменяет значение по умолчанию, чтобы развернуть все вновь добавленные показатели:

// 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)); 
      } 
     }); 

В случае, если вы хотите заменить узел с новой версией (удалить его и добавить новый в своем месте), вы можете использовать аналогичный подход: помните расширение, подключившись к QAbstractItemModel::rowsAboutToBeRemoved и используя QTreeView::isExpanded(). Состояние может быть сохранено в функции/слоте, подключенном к QAbstractItemModel::rowsInserted.

Смежные вопросы