Qt ошибка "повреждены постоянные модельные индексы" почему? - PullRequest
5 голосов
/ 13 сентября 2011

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

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

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

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

Спасибо.

1 Ответ

6 голосов
/ 13 сентября 2011

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

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

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

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

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

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

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

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

...