Я знаю, что ошибаюсь
строка:
self.model.beginRemoveRows(index.parent(),index.row(),self.model.rowCount(index))
Да, вы правы. Давайте посмотрим на то, что вы передаете:
index.parent() - the parent of index
index.row() - the row number of index, the row you want deleted
self.model.rowCount(index) - the number of total children had by index
Теперь взгляните на изображение в документации по beginRemoveRows :
Вы сказали, что хотите удалить из index.row()
строку, равную количеству детей по индексу. Ваше несоответствие вашим индексам родитель-ребенок.
То, что вы действительно хотели, было:
beginRemoveRows(index.parent(), index.row(), index.row())
Если вы удалите строку в index.row()
, , все ее дочерние элементы будут удалены автоматически .
НО , есть большая проблема: beginRemoveRows()
не НЕ удаляет все строки. Он просто предупреждает вашу модель, что вы собираетесь удалять строки. Когда вы звоните endRemoveRows()
, модель сообщит всем слушающим, что она была обновлена, поэтому они могут правильно перерисовать.
В C ++ вам не разрешено вызывать beginRemoveRows()
, потому что они являются защищенными методами, которые должна вызывать только модель.
Чтобы выполнить фильтрацию по своему усмотрению, вам необходимо создать собственную модель прокси (т.е. QSortFilterProxyModel ), которая выполняет необходимую фильтрацию. Затем вы будете манипулировать моделью QSortFilterProxy в ответ на ваш обработчик сигнала.