Название: Удаление итемов в TreeModel Отправлено: ibnz от Февраль 19, 2015, 15:05 Пытаюсь разобраться в том как написать правильную иерархическую модель в рамках Qt MV фреймворка.
тестовый примерчик на битбакете: https://bitbucket.org/ibnz/treemodeltest Проблемы возникли с тем как правильно удалять итемы. А именно с тем, как отследить некорректные указатели в индексах после удаления. Проблемная функция - удаление произвольного списка итемов. Код: void ModelScenarioPoint::removeList(const QModelIndexList &list) Очевидно, что проблема будет при удалении парента раньше чайлдов, если таковые будут иметься в списке. Но это не самое неприятное. Даже если удалять итемы из одного уровня иерархии может получить падение сразу, либо в дальнейшем. Проблема в строчке Код: beginRemoveRows(i.parent(), i.row(), i.row()); Делать QSet<PointScenario *> с актуальными указателями на итемы, и проверять на вхождение при получении в getPoint, как то коряво и неэффективно. В примере для падения достаточно выделить итемы 21 и 22, удалить их через контекстное меню, затем выбрать любой другой итем. Название: Re: Удаление итемов в TreeModel Отправлено: Swa от Февраль 19, 2015, 16:54 Между beginRemoveRows и endRemoveRows вам нужно удалять объект из списка, в котором он находится. Вы просто очищаете память, занимаемую объектом, и оставляете его трупик в списке. Неудивительно, что падает.
Должно быть так: Код: PointScenario* item = parent->childList[row]; Название: Re: Удаление итемов в TreeModel Отправлено: ibnz от Февраль 19, 2015, 16:56 Между beginRemoveRows и endRemoveRows вам нужно удалять объект из списка, в котором он находится. Вы просто очищаете память, занимаемую объектом, и оставляете его трупик в списке. Неудивительно, что падает. Должно быть так: Код: PointScenario* item = parent->childList[row]; все это происходит в деструкторе PointScenario |