什么是最适合 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::deque
。 QVector
很像 std::vector
并且需要恒定时间删除。 QList
非常类似于 QVector
存储指针有内存碎片。 QVector
和 QList
都需要线性时间删除才能从前面删除元素——这是杀手锏。您需要一个容器,其中推回和弹出前端都是恒定时间,理想情况下不是单独分配每个节点的链接结构。
【参考方案1】:
在大多数 QAbstractItemModel 子类中,最重要的优化方法通常是 data()(和 index(),但这很少有问题):这将被称为无数次,尤其是当顶部的视图启用排序时。因此,从容器中复制大块数据或进行非恒定时间查找,例如在地图中是一个坏主意。 QVector/std::vector 是一个不错的标准选择。
所以感觉一下哪些项目模型方法被调用的频率是一个很好的练习,并且可以添加一些计数器并查看。
除了快速查找之外,我认为选择主要取决于您的代码如何修改容器,这与在 QAbstractItemModel 中使用的容器无关。 Qt 不会“在内部访问容器”,所有访问都由您实现,因为您实现了 data()、rowCount() 等。此外,在某些时候优化容器也将变得毫无意义,因为视图,而不是模型,将成为瓶颈。
【讨论】:
以上是关于什么是最适合 QAbstractListModel 和 QListView 的 Qt 容器的主要内容,如果未能解决你的问题,请参考以下文章
基类 'QAbstractListModel' 具有私有复制构造函数