Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt模型替代方案_Qt - Fatal编程技术网

Qt模型替代方案

Qt模型替代方案,qt,Qt,我是老Delphi/FreePascal/Lazarus程序员。我从QT和C++编程一年。在Qt中,我最痛苦的是模型编程。特别有效。例如,用100万条记录填充QStandardItemModel需要约15秒,700MB内存使用量和QTreeView滚动几乎是不可能的(100%CPU,似乎每个滚动都会验证甚至不可见的项目)。相比之下,在Lazarus中,我有TVirtualTreeView,在这里我覆盖了一个虚拟方法OnGetData。在参数中,我从TList(类似于QList)或动态数组获取行和

我是老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中的几个方法


考虑

直接从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:你没有正确地使用它。我认为你必须提供一个简短的、自包含的测试用例,用一些数据填充模型来演示这个问题。然后我们可以证明你做错了什么。没有代码就有点太宽了。嗨,迪博。你能在这里发布你的示例代码吗?我现在需要一些帮助来实施:(