首页 文章

qtreeview需要延迟加载方法,并且只想在mem中维护查看项目

提问于
浏览
1

我想构建一个延迟加载的树(不是懒惰的人口),我遇到的问题是,我有很多数据(大约100亿到1000亿行)构建一棵树,这么多的数据显然是崩溃的树(内存问题) ) . 所以我想做延迟加载(一次我想维护我在视图中显示的那些项目) .

我对这种方法几乎没有疑问

  • 我可以使用canFetchMore()和fetchMore()函数 . 当我向下滚动时,我想得到以下项目(这可能是这个功能),我想删除不在视野范围内的项目 . 向下滚动时加载数据可以从上面的函数中获取,但是当我向上滚动时如何获取数据?

  • 如何在滚动时删除不在视野范围内的项目?

  • 如何用这种方法保持滚动条大小?

  • 最后但是我想在此基础上实现过滤器 .

我已经看过fetchMore()示例,但是它用于列表以及当视图离开时不会删除项目 . 我希望获得相同的行为,但有一棵树,并希望删除不在视图中的项目,并希望正确维护滚动条 .

请给我任何建议 .

1 回答

  • 0

    您应该使用 QTreeView 和自定义 QAbstractItemModel 实现 . 您可以完全决定模型如何与文件存储和内存一起运行 . 例如,您可以在请求时随机读取文件中的数据,并将它们放在 QCache 中进行优化 . 只要模型的虚函数(需要 index(), parent(), rowCount(), columnCount(), and data() )正常运行,视图就应该能够显示数据 .

    • 您不需要 canFetchMorefetchMore . 这些功能在您的情况下无济于事 .

    • 视图在离开视口时不必删除它们 . 实际上,不应该存在任何项目对象:为数百万个项目创建对象可能非常昂贵 . 所以只有临时索引( QModelIndex )和临时值( QVariant ) .

    • 通过在 rowCount() 中返回正确的行计数值,可以保持正确的滚动条大小和位置 . 该视图将从模型请求当前可见单元格的数据 .

    • 请参阅 QSortFilterProxyModel 文档以了解如何动态过滤模型 . QSortFilterProxyModel 应该能够使用您的模型作为源,并且不应该在此过程中消耗大量内存 .

    虽然它在理想情况下工作,但实施中的一些缺陷可能会导致麻烦 . 如果发生这种情况,创建自己的视图类可能是唯一的方法 .

相关问题