QAbstractItemModel - QModelIndex 对象在创建时是不是应该被缓存?

Posted

技术标签:

【中文标题】QAbstractItemModel - QModelIndex 对象在创建时是不是应该被缓存?【英文标题】:QAbstractItemModel - Should QModelIndex objects be cached when created?QAbstractItemModel - QModelIndex 对象在创建时是否应该被缓存? 【发布时间】:2021-05-05 21:20:36 【问题描述】:

当继承 QAbstractItemModel 并重新实现 index() 方法时,我每次都只是简单地使用 createIndex() 返回一个新索引。但我注意到index() 方法在模型与视图结合使用时会被调用数千次,用于各种绘制事件等等。

我是否应该在第一次在index() 中生成QModelIndex 对象后缓存它,然后在随后在同一行/列上调用index() 时返回缓存的索引?文档中没有提到,似乎索引本身在某些情况下可能会失效,所以我不确定这里该怎么做。

在我的特殊情况下,我正在使用 Pyside6,但我认为这可能适用于 Qt 框架的任何实现。

【问题讨论】:

缓存QModelIndex是不安全的:见qt docs中的注释。您还应该警惕使用QPersistentModelIndex,因为它会带来显着的性能损失。最重要的是,您应该进行一些真实世界的分析,并查看在您的模型设计使用的上下文中是否存在任何重大性能问题(即避免过早优化)。跨度> 【参考方案1】:

如果您的模型支持插入或删除行,则您的索引不是持久的。您仍然可以使用缓存,但每次模型形状更改时都必须使其无效。 如果创建索引逻辑很复杂,那么缓存可能会有好处。 QModelIndex 的大小约为四个整数(行、列和指针/id 和指针),因此它相对轻量级,创建和移动它很便宜。 无论哪种方式,只有一种方法可以确定:尝试缓存并衡量性能增益。

【讨论】:

以上是关于QAbstractItemModel - QModelIndex 对象在创建时是不是应该被缓存?的主要内容,如果未能解决你的问题,请参考以下文章

QTreeView 的 QAbstractItemModel:我做错了啥?

QAbstractItemModel - QModelIndex 对象在创建时是不是应该被缓存?

QAbstractItemModel index() 和 parent() 方法

Qt:QAbstractItemModel 中的 setData 方法

在 QAbstractItemModel 中返​​回正数行和零列是不是可以?

QAbstractItemModel 和 QModelIndex 之间的相互作用