Ошибка Qt "постоянные модельные индексы повреждены", почему?

У меня проблема с моим приложением Qt/ для интервью. Я использую QTreeView для отображения данных дерева. Я реализовал свою собственную модель на основе QAbstractItemModel.

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

Не могли бы вы объяснить мне, что означает эта ошибка. Что такое QPersistentModelIndex? Я не использую QPersistentModelIndex в моем коде.

ASSERT failure in QPersistentModelIndex::~QPersistentModelIndex: "persistent model indexes corrupted"

Благодарю.

1 ответ

Решение

QPersistentModelIndexes являются (строка, столбец, родитель) ссылками на элементы, которые автоматически обновляются, когда ссылочные элементы перемещаются внутри модели, в отличие от обычной QModelIndex,
Например, если вы вставите одну строку, все существующие постоянные индексы, расположенные ниже точки вставки, будут иметь свои row свойство увеличивается на единицу.

Вы не можете использовать их напрямую, но QTreeView делает, например, для отслеживания расширенных элементов и выбранных элементов.

И для обновления этих постоянных индексов вы должны вызвать функции QAbstractitemModel::beginInsertRows() а также endInsertRows() вокруг фактической вставки строк при добавлении новых записей.

Подробности смотрите в конце раздела о подклассах классов моделей: http://doc.trolltech.com/latest/qabstractitemmodel.html

Я нашел этот метод QAbstractItemModel::persistentIndexList и мне интересно, какие индексы он должен возвращать. Все они?
Должен ли этот метод вернуть все узлы, видимые в данный момент в TreeView?

Этот метод возвращает только индексы, для которых QPersistentIndexModel был создан и все еще находится в области видимости (как локальная переменная, член класса или QList<QPersistentIndexModel> например).

Расширенные или выбранные узлы в настоящее время не обязательно видны, поэтому вы не можете (и не должны) предполагать, для чего используются эти постоянные индексы.

Вы просто должны держать их в курсе, и вам нужно только использовать persistentIndexList для больших изменений в модели, таких как сортировка (см. QTreeWidget внутренняя модель: QTreeModel::ensureSorted (ссылка)), для небольших дополнительных изменений у вас есть все beginXxxRows/beginXxxColumns а также endXxxRows/endXxxColumns методы.

Другие вопросы по тегам