需要延迟加载方法来进行qtreeview&想要只在mem中维护查看项目

时间:2015-07-04 06:27:33

标签: qt qtreeview qabstractitemmodel

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

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

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

  2. 滚动时如何删除不在视图中的项目?

  3. 如何使用此方法维护滚动条大小?

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

  5. 我见过fetchMore()示例但是它用于列表&在离开视图时,项目不会被删除。我希望得到相同的行为但是有一棵树&想删除不在视野范围内的物品想要正确维护滚动条。

    请提出任何建议。

1 个答案:

答案 0 :(得分:0)

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

  1. 您不需要canFetchMorefetchMore。这些功能在您的情况下不会有太大帮助。

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

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

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

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