Qt错误“持久模型索引损坏”为什么?

发布于 2024-12-04 03:49:00 字数 344 浏览 1 评论 0原文

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

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

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

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

谢谢。

I've a problem with my Qt/interview application. I use QTreeView to display tree data. I implemented my own model based on QAbstractItemModel.

I get a following error prior to application crash. It happens often after I add new record.

Could You explain to me what is the meaning of this error. What is a QPersistentModelIndex ?
I'm not using QPersistentModelIndex in my code.

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

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

狠疯拽 2024-12-11 03:49:00

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

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

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

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

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

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

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

您只需保持它们更新,并且只需要使用 persistentIndexList 来对模型进行重大更改,例如排序(请参阅 QTreeWidget 内部模型:QTreeModel::ensureSorted(link)),对于较小的增量更改,您拥有所有 beginXxxRows/beginXxxColumnsendXxxRows/endXxxColumns 方法

QPersistentModelIndexes are (row, column, parent) references to items that are automatically updated when the referenced items are moved inside the model, unlike regular QModelIndex.
For instance, if you insert one row, all existing persistent indexes positioned below the insertion point will have their row property incremented by one.

You may not use them directly, but QTreeView does, to keep track of expanded items and selected items, for example.

And for these persistent indexes to be updated, you have to call the functions QAbstractitemModel::beginInsertRows() and endInsertRows() around the actual row insertion(s) when you add new records.

See the end of the section about subclassing model classes for details: http://doc.trolltech.com/latest/qabstractitemmodel.html#subclassing

I found this method QAbstractItemModel::persistentIndexList and I'm
wondering what indexes it should return. All of them ?
Should this method return all nodes currently visible in the TreeView ?

That method returns only the indexes for which a QPersistentIndexModel was created and is still in scope (as a local variable, a class member, or in a QList<QPersistentIndexModel> for example).

Expanded or selected nodes are not necessarily currently visible, so you can't (and shouldn't anyway) assume anything about what these persistent indexes are used for.

You just have to keep them updated, and you only need to use persistentIndexList for big changes in the model, like sorting (see QTreeWidget internal model : QTreeModel::ensureSorted(link)), for smaller incremental changes you have all the beginXxxRows/beginXxxColumns and endXxxRows/endXxxColumns methods.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文