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 方法