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