【问题标题】:Loading data in QTreeView async在 QTreeView 中异步加载数据
【发布时间】:2015-08-09 04:46:35
【问题描述】:

我有一个非常大的树结构,我无法将完整的树加载到客户端的 Ram 中。我正在使用 Qt 的 QTreeView。

我想在用户展开元素时动态加载项目的子元素。

当用户在树中打开一个项目时是否有一些信号触发?

我正在使用教程Simple Tree Model Example。当我对模型进行更改时,视图也必须更新。而且我不想失去焦点以避免用户混淆!

一段时间后(向服务器请求)...

【问题讨论】:

    标签: c++ qt qtreeview model-view


    【解决方案1】:

    您需要实现一个QAbstractItemModel 的子类,它可以处理所需的数据量。当一个项目在视图中展开时,它调用QAbstractItemModel::rowCount 来确定孩子的数量,然后调用QAbstractItemModel::flagsQAbstractItemModel::data 来获取孩子的数据。如果请求的数据目前不可用,您应该返回占位符数据(即包含“正在加载”的 1 行),并开始请求。当接收到数据时,发出rowsAboutToBeInsertedrowsInserted 信号来通知视图有新数据(你也应该通知它关于删除“加载”行)。然后视图将再次调用rowCountdataflags 方法,您的模型现在应该提供加载的数据。使用QCache 将上次访问的数据保存在内存中。

    【讨论】:

    • 你会如何使用 QCache?您是否必须将 row/col/parent 组合成一个索引,然后跟踪模型的插入/删除/更改以使缓存保持最新(或刷新任何更改)?
    • 这种方法适用于大表(不是树)吗?我认为这个答案只适用于每个父母拥有少量孩子的树。
    猜你喜欢
    • 2016-08-21
    • 2019-01-11
    • 2019-07-06
    • 2021-08-17
    • 2019-04-23
    • 2021-01-03
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多