Qt模型替代方案
我是老Delphi/FreePascal/Lazarus程序员。我从QT和C++编程一年。在Qt中,我最痛苦的是模型编程。特别有效。例如,用100万条记录填充QStandardItemModel需要约15秒,700MB内存使用量和QTreeView滚动几乎是不可能的(100%CPU,似乎每个滚动都会验证甚至不可见的项目)。相比之下,在Lazarus中,我有TVirtualTreeView,在这里我覆盖了一个虚拟方法OnGetData。在参数中,我从TList(类似于QList)或动态数组获取行和列索引并返回数据。结果:填充100万条记录=150毫秒,+20MB内存,完全负责滚动(仅对可见项调用OnGetData)。我还尝试了QabstracteModel,进行了大量的编码,只减少了内存使用(没有这么多) 我的问题是:模型编程有没有其他选择?几个月前,我在QTreeView中看到了自定义数据集的教程,但现在找不到。他们使用简单的QList并覆盖QTreeView中的几个方法Qt模型替代方案,qt,Qt,我是老Delphi/FreePascal/Lazarus程序员。我从QT和C++编程一年。在Qt中,我最痛苦的是模型编程。特别有效。例如,用100万条记录填充QStandardItemModel需要约15秒,700MB内存使用量和QTreeView滚动几乎是不可能的(100%CPU,似乎每个滚动都会验证甚至不可见的项目)。相比之下,在Lazarus中,我有TVirtualTreeView,在这里我覆盖了一个虚拟方法OnGetData。在参数中,我从TList(类似于QList)或动态数组获取行和
考虑直接从QabstracteModel派生您自己的模型。将其用作自定义(高效)数据存储的接口。好的,我在阅读
qabstractemmodel
文档时仔细重写了模型。我减少了很多内存使用,但在滚动一百万条记录时仍然有延迟。我将QTreeView
更改为QListView
/QTableView
,一切都运行得非常快。因此,我检查了QTreeView属性并禁用了itemsExpandable
和uniformRowHeights
。最后,我的观点是快速而激烈的:)。加载1 mln记录=1秒,+140MB内存,平滑滚动,无延迟。谢谢 QStandardItemModel是一个复杂的多行业千斤顶,具有大量开销。对于一百万件物品来说,定制模型是必须的。那么QAIM只是您自己数据的API。一个OOTB选项可能是sqlite和股票QtSQL模型。您能发布一些示例代码吗?QStandardItemModel在有这么多条目的情况下无法很好地执行。另外,模型视图系统可能是Qt中最复杂的部分,所以把学习它作为一项大任务,需要真正的学习。从简单的事情开始,比如子类化QAbstractListModel,不要直接跳到子类化QAIM。一个QStandardItemModel
是一个方便的类。它是用来装少量物品的。qabstractemmodel
将节省内存,因为视图没有以任何方式缓存元素。您还需要在视图上设置固定的项目高度。然后更新是即时的。IOW:你没有正确地使用它。我认为你必须提供一个简短的、自包含的测试用例,用一些数据填充模型来演示这个问题。然后我们可以证明你做错了什么。没有代码就有点太宽了。嗨,迪博。你能在这里发布你的示例代码吗?我现在需要一些帮助来实施:(