什么是最适合QAbstractListModel和QListView的Qt容器

What is the most appropriate Qt container for QAbstractListModel and QListView

本文关键字:QListView Qt 容器 QAbstractListModel 什么      更新时间:2023-10-16

我从QAbstractListModel继承并使用QVector作为内部容器,创建了一个QListView模型。我的模型只允许将文本附加到列表的后面,也只允许从前面删除项目。擦除操作是分批的(即,每次列表太大时,我都会从前面擦除大约10%的项目)。

什么是最好的容器?

目前我正在使用QVector,因为我希望在这种情况下,与QList之类的东西相比,性能(连续内存布局)会更好。然而,我不确定Qt是如何在内部访问容器的,也不确定容器是否是连续的。

在大多数QAbstractItemModel子类中,最重要的优化方法通常是data()(和index(),但这很少是问题):它会被调用无数次,尤其是当顶部的视图启用排序时。因此,从容器中复制大块数据或进行非恒定时间查找(例如在映射中)是个坏主意。QVector/std::vector是一个很好的标准选择。

因此,了解哪种项目模型方法被称为多久一次是一项很好的练习,可以添加一些计数器并查看。

除了快速查找之外,我认为选择主要取决于您的代码如何修改容器,这与QAbstractItemModel中使用的容器无关。Qt不"内部访问容器",所有访问都是由您实现的,因为您实现了data()、rowCount()等。此外,在某个时候,对容器进行更多优化也将变得毫无意义,因为视图而不是模型将成为瓶颈。