Я реализовал свой собственный 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)
Что ж, вам не нужно возиться с changePersistentIndex, вызывая beginRemoveRows и endRemoveRows автоматически обновит все постоянные индексы, существующие в настоящее время в модели. Единственный недопустимый QPersistentModelIndex, который вы должны иметь после удаления строк, — это индекс строк, которые были фактически удалены
Других решений пока нет …