首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除行时,QModelIndex变得无效

删除行时,QModelIndex变得无效
EN

Stack Overflow用户
提问于 2015-07-22 16:54:36
回答 1查看 2.4K关注 0票数 4

我在子类QAbstractItemModel中显示QTreeView中的项,在这个子类(projectModel)中,我有一个函数来删除树视图中当前选定的索引。Component是用来表示模型所有成员的类:

代码语言:javascript
复制
void
projectModel::deleteComponent()
{
    QModelIndex child_index = _treeview->selectionModel()->currentIndex();
    Component* child = static_cast<Component*>(child_index.internalPointer());

    Component* parent = child->Parent();
    QModelIndex parent_index = createIndex(parent->row(), 0, parent);

    int row = child->row();

    beginRemoveRows(parent_index, row, row);
    parent->delete_child(child);
    endRemoveRows();
}

父和子指示符和原始指针在调用beginRemoveRows之前是好的;调试器显示它们指向正确的项及其父项。但是,程序在调用beginRemoveRows后崩溃。具体来说,它在projectModel::parent()中崩溃。

代码语言:javascript
复制
QModelIndex
projectModel::parent(const QModelIndex &index) const
{    
    if (!index.isValid())
        return QModelIndex();

    Component* item = getItem(index);        //Fails to cast index internal pointer to a valid Component*
    Component* parentItem = item->Parent();

    if (parentItem == _rootnode)
        return QModelIndex();

    return createIndex(parentItem->row(), 0, parentItem);
}

当我中断崩溃并检查调试器输出时,它会显示parent()函数中的变量parent()是垃圾。不知怎么的,我的QModelIndex在调用deleteComponent和调用parent之间似乎被破坏了。我正在做的事情有什么明显的错误吗?还是问题可能更微妙?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-22 17:43:09

这是完全可以预料到的。

在更改模型的结构之前,非持久性索引是有效的。结构更改是指通过发射dataChanged以外发出信号的任何更改。

结构更改必须被视为索引生存期的障碍:必须丢弃任何在结构更改之前保存的非持久性索引。

取决于调用deleteComponent的位置,可能发生的情况是调用方持有一些索引,deleteComponent使它们都无效,从那时起,您将处于未定义的行为领域。

如果希望持久性索引在结构更改中仍然有效,则需要使用持久索引,即使这样,它们也只有在给定项仍然存在的情况下才有效。如果使用自己的模型,则需要显式支持持久索引,模型的用户必须使用它们。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31569424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档