Qt错误"持久模型索引已损坏"为什么?

5 qt qt4 qtreeview qabstractitemmodel

我的Qt /面试申请表有问题.我使用QTreeView来显示树数据.我基于QAbstractItemModel实现了自己的模型.

在应用程序崩溃之前我收到以下错误.它经常在我添加新记录后发生.

你能解释一下这个错误是什么意思吗?什么是QPersistentModelIndex?我在代码中没有使用QPersistentModelIndex.

ASSERT failure in QPersistentModelIndex::~QPersistentModelIndex: "persistent model indexes corrupted"
Run Code Online (Sandbox Code Playgroud)

谢谢.

ale*_*sdm 6

QPersistentModelIndexes是(行,列,父)对引用项在模型内移动时自动更新的项的引用,与常规项不同QModelIndex.
例如,如果插入一行,则位于插入点下方的所有现有持久性索引的row属性将增加1.

例如,您不能直接使用它们,但QTreeView可以跟踪扩展项目和所选项目.

并且要更新这些持久性索引,您必须在添加新记录时调用函数QAbstractitemModel::beginInsertRows()endInsertRows()实际行插入.

有关详细信息,请参阅有关子类化模型类的部分的结尾:http://doc.trolltech.com/latest/qabstractitemmodel.html#subclassing

我找到了这个方法QAbstractItemModel::persistentIndexList,我想知道它应该返回什么索引.他们都是 ?
此方法是否应返回TreeView中当前可见的所有节点?

该方法仅返回QPersistentIndexModel已创建a且仍在范围内的索引(作为局部变量,类成员或在QList<QPersistentIndexModel>例如中).

扩展或选定的节点当前不一定是可见的,因此您不能(也不应该)假设这些持久性索引的用途.

您只需要更新它们,您只需要使用persistentIndexList模型中的重大更改,例如排序(请参阅QTreeWidget内部模型:( QTreeModel::ensureSorted链接)),以获得所有beginXxxRows/beginXxxColumnsendXxxRows/endXxxColumns方法的较小增量更改.

  • 如果您之前没有使用begin/endInsertRows,是的,这是问题或其中的一部分.根据qabstractitemmodel.cpp中的注释,如果"模型使用changePersistentIndex以一种可能导致两个QPersistentModelIndex指向同一索引的方式",则会出现该错误. (2认同)