1

我已经实现了我自己的QAbstractListModel,它基于std::vector. 我现在想在QGraphicsScene. 为此,我实现了我自己的QGraphicsItem,它将 a 存储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)
4

1 回答 1

3

好吧,您不需要摆弄 changePersistentIndex,调用 beginRemoveRows 和 endRemoveRows 将自动更新模型上当前存在的所有持久索引。删除行后唯一无效的 QPersistentModelIndex 是实际删除的行的索引

于 2016-02-05T15:29:24.330 回答