Как работает beginRemoveRows()/endRemoveRows и их аналоги?

286
27 декабря 2017, 21:02

в доках четко написано:

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);

то есть вначале удалить индекс в модели а затем из своей структуры.

Answer 1

Не очень понятно, что у Вас за сигналы такие sg_beginRemoveRow, sg_endRemovRow. Методы beginInsertRows, endInsertRows должны вызывается в Вашем классе-модели, наследнике QAbstractTableModel или подобном, для того они и сделаны protected.

Правильное использование можно посмотреть в примерах qt abstractitemmodel или adressbook

endRemoveRows дает понять отображению, что изменились какие-то данные, и для указанных строк нужно перечитать данные из модели, вызовом метода data. Если вы данные из модели будет удалять "после", то будете в view получать устаревшие значения.

Answer 2

Потому что предполагается, что между вызовами begin* и end* модель может находиться в некорректном состоянии. Это у вас контейнер и все, но бывают модели очень сложные когда нужно и в сеть и в базу сходить, что-то преобразовать... Так вот технически бывает сложно сделать это все за один вызов функции. И еще не забывайте, что модель в Qt это не только списки/таблицы, это еще деревья.

READ ALSO
QSqlTableModel не вызывается rowsInserted

QSqlTableModel не вызывается rowsInserted

При select в QSqlTableModel не вызывается сигнал rowsInsertedИ вызывается только тогда когда добавляется строка через insertRow

195
QLabel и текст с url

QLabel и текст с url

Как заставить QLabel выделять url в (не статичном) тексте и открывать их в браузере? Вот код для примера:

223
Сортировка объектов по алфавиту

Сортировка объектов по алфавиту

Как отсортировать объекты по инициалам? Те когда я буду заполнять массив объектов, хочу чтобы они выводились не в порядке заполнения, а по алфавитному...

215
Проблема с Android sdk

Проблема с Android sdk

Уже несколько раз устанавливал Android Studio, но не могу понять в чем проблемаВ окне, где должны быть обозначены компоненты нет необходимого мне...

179