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

Posted

技术标签:

【中文标题】什么是最适合 QAbstractListModel 和 QListView 的 Qt 容器【英文标题】:What is the most appropriate Qt container for QAbstractListModel and QListView 【发布时间】:2015-12-13 06:46:13 【问题描述】:

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

什么是最好的容器?

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

【问题讨论】:

你必须使用Qt容器吗?也许理想的只是标准 C++ 库的std::dequeQVector 很像 std::vector 并且需要恒定时间删除。 QList 非常类似于 QVector 存储指针有内存碎片。 QVectorQList 都需要线性时间删除才能从前面删除元素——这是杀手锏。您需要一个容器,其中推回和弹出前端都是恒定时间,理想情况下不是单独分配每个节点的链接结构。 【参考方案1】:

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

所以感觉一下哪些项目模型方法被调用的频率是一个很好的练习,并且可以添加一些计数器并查看。

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

【讨论】:

以上是关于什么是最适合 QAbstractListModel 和 QListView 的 Qt 容器的主要内容,如果未能解决你的问题,请参考以下文章

什么是最适合云数据库的架构设计?

为什么说php是最适合新手的编程语言

什么样的大数据平台架构,才是最适合你的?

基类 'QAbstractListModel' 具有私有复制构造函数

为 QML ListView 实现 QAbstractListModel 子类?

QMetaProperty::read: 无法处理未注册的数据类型 'QAbstractListModel*'