【问题标题】:Qt error "persistent model indexes corrupted" why?Qt错误“持久模型索引损坏”为什么?
【发布时间】:2011-09-12 23:22:19
【问题描述】:

我的 Qt/面试应用程序有问题。我使用 QTreeView 来显示树数据。我基于 QAbstractItemModel 实现了自己的模型。

我在应用程序崩溃之前收到以下错误。我添加新记录后经常发生这种情况。

你能解释一下这个错误的含义吗?什么是 QPersistentModelIndex ? 我没有在我的代码中使用 QPersistentModelIndex。

ASSERT failure in QPersistentModelIndex::~QPersistentModelIndex: "persistent model indexes corrupted"

谢谢。

【问题讨论】:

  • 您在模型中使用了 layoutAboutToBeChanged 和 layoutChanged 信号吗?

标签: qt qt4 qtreeview qabstractitemmodel


【解决方案1】:

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

您可能不直接使用它们,但 QTreeView 可以,例如,跟踪展开的项目和选定的项目。

而要更新这些持久性索引,您必须在添加新记录时围绕实际插入的行调用函数 QAbstractitemModel::beginInsertRows() 和 endInsertRows()。

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

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

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

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

您只需要保持更新,您只需使用persistentIndexList 对模型进行重大更改,例如排序(请参阅QTreeWidget 内部模型:QTreeModel::ensureSorted(link)),对于较小的增量更改,您拥有所有beginXxxRows/beginXxxColumns and endXxxRows/endXxxColumns methods.

【讨论】:

  • 感谢您的回答 :) 我找到了 QAbstractItemModel::persistentIndexList 这个方法,我想知道它应该返回什么索引。都是??
  • 我的意思是这个方法应该返回当前在 TreeView 中可见的所有节点。还是有其他规则?
  • @David 我完成了我的回答来回答你的问题。
  • 谢谢,这很有帮助 :) 我想知道什么可能导致“持久模型索引损坏”错误。这是不是错误使用 begin/endInsertRows()、begin/endRemoveRows() 的问题。或者这是内部索引/父级/rowCount ...方法的问题?有什么线索吗?再次感谢。
  • 如果您之前没有使用 begin/endInsertRows,是的,这就是问题所在或部分原因。根据 qabstractitemmodel.cpp 中的 cmets,如果“模型使用 changePersistentIndex 的方式可能导致两个 QPersistentModelIndex 指向同一索引”,则会出现该错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
相关资源
最近更新 更多