removeRows () и QPersistentModelIndex

Я реализовал свой собственный QAbstractListModel который основан на std::vector, Теперь я хочу отобразить содержимое этой модели в QGraphicsScene, Для этого я реализовал свой собственный QGraphicsItem который хранит QPersistentModelIndex в качестве указателя на данные.

Я реализовал removeRows метод следующим образом:

bool VectorModel::removeRows(int row, int count, const QModelIndex& parent) {
if (row + count < _vector.size()) {
beginRemoveRows(QModelIndex(), row, row + count);
_vector.erase(_vector.begin() + row, _vector.begin() + row + count);
endRemoveRows();
return true;
}
return false;
}

Теперь, так как я удаляю некоторые элементы, индекс следующих элементов изменится. Из-за этого QPersistentModelIndex должен быть скорректирован.

Я нашел changePersistentIndex() метод в QAbstractItemModel и я знаю, что могу получить все постоянные индексы с persistentIndexList(), Однако я не знаю, как правильно скорректировать индексы, используя этот метод. Как это может быть сделано?

Будет ли достаточно изменить эти показатели, чтобы предотвратить Invalid index ошибки?

Обновить

Я изменил removeRows() с улучшениями @Sebastian Lange, однако он все еще не работает, как ожидалось, и я получаю Invalid index ошибки:

bool LabelModel::removeRows(int row, int count, const QModelIndex& parent) {
Q_UNUSED(parent)
if (row + count < _vector.size()) {
beginRemoveRows(QModelIndex(), row, row + count);
_vector.erase(_vector.begin() + row, _vector.begin() + row + count);
endRemoveRows();

auto pil = persistentIndexList();
for(int i = 0; i < pil.size(); ++i)
{
if (i >= row + count) {
changePersistentIndex(pil[i], pil[i-count]);
}
}
return true;
}
return false;
}

Выданные ошибки выглядят так (при удалении 7-го элемента):

QAbstractItemModel::endRemoveRows:  Invalid index ( 7 , 1 ) in model QAbstractListModel(0x101559320)
QAbstractItemModel::endRemoveRows:  Invalid index ( 8 , 1 ) in model QAbstractListModel(0x101559320)
QAbstractItemModel::endRemoveRows:  Invalid index ( 9 , 1 ) in model QAbstractListModel(0x101559320)
QAbstractItemModel::endRemoveRows:  Invalid index ( 10 , 1 ) in model QAbstractListModel(0x101559320)
QAbstractItemModel::endRemoveRows:  Invalid index ( 6 , 1 ) in model QAbstractListModel(0x101559320)

1

Решение

Что ж, вам не нужно возиться с changePersistentIndex, вызывая beginRemoveRows и endRemoveRows автоматически обновит все постоянные индексы, существующие в настоящее время в модели. Единственный недопустимый QPersistentModelIndex, который вы должны иметь после удаления строк, — это индекс строк, которые были фактически удалены

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]