我想构建一个延迟加载的树(不是懒惰的人口),我遇到的问题是,我有很多数据(大约100亿到1000亿行)构建一棵树,这么多的数据显然是崩溃的树(记忆问题)。所以我想做延迟加载(一次我想维护我在视图中显示的那些项目)。
我对这种方法几乎没有怀疑
我可以使用canFetchMore()& fetchMore()函数。当我向下滚动时,我想得到以下项目(这可能是这个功能),我想删除不在视野范围内的项目。 向下滚动时加载数据可以从上面的函数中获取,但是当我向上滚动时如何获取数据?
滚动时如何删除不在视图中的项目?
如何使用此方法维护滚动条大小?
最后但我想在此基础上实现过滤器。
我见过fetchMore()示例但是它用于列表&在离开视图时,项目不会被删除。我希望得到相同的行为但是有一棵树&想删除不在视野范围内的物品想要正确维护滚动条。
请提出任何建议。
答案 0 :(得分:0)
您应该使用QTreeView
和自定义QAbstractItemModel
实施。您可以完全决定模型如何与文件存储和内存一起运行。例如,您可以在请求时随机读取文件中的数据,并将其放在QCache
中进行优化。只要模型的虚函数(index(), parent(), rowCount(), columnCount(), and data()
是必需的)正常运行,视图就应该能够显示数据。
您不需要canFetchMore
和fetchMore
。这些功能在您的情况下不会有太大帮助。
视图不会保留项目对象,因此您在离开视口时不必删除它们。实际上,不应该存在任何项目对象:为数百万个项目创建对象可能非常昂贵。因此,只有临时索引(QModelIndex
)和临时值(QVariant
)。
您可以通过在rowCount()
中返回正确的行计数值来维护正确的滚动条大小和位置。该视图将从模型请求当前可见单元格的数据。
请参阅QSortFilterProxyModel
文档,了解如何动态过滤模型。 QSortFilterProxyModel
应该能够将您的模型用作源代码,并且不应在此过程中消耗大量内存。
虽然它在理想情况下有效,但QTreeView
实施中的一些缺陷可能会导致麻烦。如果发生这种情况,创建自己的视图类可能是唯一的方法。