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