我正在子类化QAbstractItemModel
显示项目QTreeView
,并且在这个子类中(projectModel
),我有一个功能可以删除树视图中当前选定的索引。Component
是用于表示模型所有成员的类:
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()
:
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);
}
当我中断崩溃并检查调试器输出时,它显示变量item
in the parent()
功能就是垃圾。不知怎的,它看起来像我的QModelIndex
在调用之间被损坏deleteComponent
并致电parent
。我所做的事情是否存在明显的错误,或者问题可能更微妙?
这是完全可以预料到的。
在您更改模型结构之前,非持久索引一直有效。结构性变化是指任何已发出信号的变化other比通过发射dataChanged
.
结构变化必须被视为索引生命周期的障碍:您必须丢弃结构变化之前持有的任何非持久索引。
取决于地点deleteComponent
被调用时,可能发生的情况是调用者持有一些索引,deleteComponent
使它们全部无效,从那时起您就处于未定义的行为领域。
如果您希望持久索引在结构变化时保持有效,则需要使用持久索引,即使如此,它们也仅在给定项目仍然存在时才有效。如果您使用自己的模型,则需要显式支持持久索引,并且模型的用户必须使用它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)