来自QTreeView

时间:2017-01-13 11:59:31

标签: c++ qt qtreeview qmodelindex

获取QTreeView显示的当前可见项目列表的最佳方法是什么?是否可以在更改时收到通知?

我的模型的数据可以异步更改应用程序(数据来自硬件寄存器)。刷新数据可能很慢,所以我想在专用线程中定期刷新。我不想刷新所有项目,因为效率非常低,只有可见的项目。

我知道this,但在我的情况下,数据会异步更改,因此只有在调用setData()时才能刷新项目。

1 个答案:

答案 0 :(得分:0)

忽略视图并专注于模型可能更容易。

您可以在简单的预先刷新缓存上对其进行建模:.data()返回上一个已知值,但也会安排更新。由于视图会调用model.data(index)

  • 当索引进入视图时,
  • 每次更改(使用dataChanged()信号),同时索引可见

这可以形成一个循环来轮询可见项目。当单元格不可见时,视图将停止调用.data(),终止循环。 您还应该考虑到data()可以在此循环之外调用,因此没有任何中断。

可能的顺序

UI

  1. Cell进入视图
  2. 查看来电model.data(cell, Qt::DisplayRole)
    • 将单元格添加到预定索引集(如果尚未安排)
    • 返回旧数据或默认数据
  3. 异步更新数据,发出dataChanged()
  4. 视图中的任何一个单元格,视图将再次调用model.data() - 循环回到步骤2,或者单元格不可见,序列在此处结束。
  5. 数据线程

    1. 每隔X ms更新所有预定索引(清除该设置)。
    2. 这将满足您连续/异步轮询可见模型项的要求。