в доках четко написано:
beginRemoveRows():
Note: This function emits the rowsAboutToBeRemoved() signal which connected views (or proxies) must handle before the data is removed. Otherwise, the views may end up in an invalid state.
так же и в endRemoveRows()
you must call this function after removing data from the model's underlying data store.
приходится писать вот такой вот код:
emit serv->sg_beginRemoveRow(1, i, pThis);
m_childItems.remove(i);
emit serv->sg_endRemovRow();
если раскрыть эти слоты, то там в первом begin в конце end
почему нельзя вот такое вот:
emit serv->sg_beginRemoveRow(1, i, pThis);
emit serv->sg_endRemovRow();
m_childItems.remove(i);
то есть вначале удалить индекс в модели а затем из своей структуры.
Не очень понятно, что у Вас за сигналы такие sg_beginRemoveRow, sg_endRemovRow. Методы beginInsertRows, endInsertRows должны вызывается в Вашем классе-модели, наследнике QAbstractTableModel или подобном, для того они и сделаны protected.
Правильное использование можно посмотреть в примерах qt abstractitemmodel или adressbook
endRemoveRows дает понять отображению, что изменились какие-то данные, и для указанных строк нужно перечитать данные из модели, вызовом метода data. Если вы данные из модели будет удалять "после", то будете в view получать устаревшие значения.
Потому что предполагается, что между вызовами begin* и end* модель может находиться в некорректном состоянии. Это у вас контейнер и все, но бывают модели очень сложные когда нужно и в сеть и в базу сходить, что-то преобразовать... Так вот технически бывает сложно сделать это все за один вызов функции. И еще не забывайте, что модель в Qt это не только списки/таблицы, это еще деревья.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости