用于分层数据的QAbstractItemModel的实现

时间:2014-07-21 14:44:05

标签: c++ qt model-view-controller

我有分层数据结构(3d空间中的项目),我需要在TreeView中显示这些数据。据我所知在Qt中实现这一点,我需要通过我的数据实现QAbstractItemModel,并且由于某些原因我遇到了麻烦:

  1. 我的数据有很多修改方法,所以我需要投入很多 通知代码(它使我的模型膨胀)
  2. 我的数据经历了很多变化,可能是一个瓶颈 通过调用AboutToSmthChange通知每个更新。和SmthChanged
  3. 我正在考虑两种可能的解决方案:

    1. 实现QAbstractItemModel,就像存储副本的代理模型一样 分层数据与实际节点的链接并更新它 代理模型与需求源模型比较(使用 Qt :: Queued Connection用于连接更新信号和插槽)。
    2. 只需使用QTreewidget并按需更新。
    3. 我的问题是,如果我的应用程序具有以下工作流程,那么处理这种情况的最佳方法是:它有多个数据和数据结构更新,通常需要10-500毫秒,所有数据包含的节点不超过10000个,数据更改依次更新树视图,几秒钟后一切都重复

      BTW:从TreeView的角度来看,我的数据结构是只读的,所有更改都是对我的数据执行的,然后只是在TreeView中反映

1 个答案:

答案 0 :(得分:1)

您的Qt模型当然可以充当代理。如果您将更新通知视为瓶颈,则更新通知只是瓶颈。使用排队连接当前每次调用都会增加2+n堆分配,其中n是参数的数量,因此在您的情况下使用它们会适得其反。

最终,Qt需要基于订阅的更改通知,因为树视图可能对隐藏项目的更新不感兴趣。但是,这样的通知只有一个名义上的开销,因为视图不会对它们造成任何沉重的负担。