Привет,
Я писал неприятный код для поддержки отмены / возврата удаления произвольного набора объектов из моей модели. Мне кажется, что я делаю это правильно, поскольку все другие мутаторы (добавление / копирование-вставка) являются подмножествами этой функции.
Код более мерзкий, чем мне нужно, в основном потому, что единственный способ изменить модель включает вызов beginInsertRows / beginRemoveRows и удаление строк в диапазоне (просто выполняя по одной строке за раз, нет необходимости оптимизировать "соседей" в одну звоните пока)
Проблема с beginInsertRows / beginRemoveRows заключается в том, что удаление строки может повлиять на другой QModelIndex (скажем, кэшированный в списке). Например:
ParentObj
->ChildObj1
->ChildObj2
->ChildObj3
Скажем, я выбираю ChildObj1 и ChildObj3 и удаляю их, если я сначала удалю ChildObj1, я изменил QModelIndex ChildObj3 (строка теперь другая). Подобные проблемы возникают, если я удаляю родительский объект (но я исправил это, «вырезав» дочерние элементы из списка объектов).
Вот способы, которыми я думал обойти это ограничение интерфейса, но я подумал, что попрошу лучше, прежде чем двигаться дальше:
Двигайтесь «назад», предполагая, что предоставленный список QModelIndices упорядочен сверху вниз, просто двигайтесь снизу вверх. Это действительно требует, чтобы сортировка была надежной, и сортировка, вероятно, была бы чем-то наивным и медленным (может быть, есть умный способ сортировки коллекции QModelIndexes? Или QItemSelectionModel предоставляет хорошие (упорядоченные) списки?)
Обновляйте другие QModelIndeces каждый раз, когда объект удаляется / добавляется (не могу придумать ненаивное решение, выполните поиск в списке, получите новые QModelIndeces там, где это необходимо)
Поскольку обновить фактические данные просто, просто обновите данные и перестройте модель. Это кажется гротескным, и я могу представить, как это происходит довольно медленно с большими наборами данных.
Это идеи, которые у меня есть сейчас. Я сейчас работаю над вариантом 1.
С уважением, Дэн О