QTreeView中可见项目的列表

List of visible items from QTreeView

本文关键字:列表 项目 QTreeView      更新时间:2023-10-16

获取QTreeView显示的当前可见项目列表的最佳方式是什么?当它发生变化时,是否可以获得通知?

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

我知道这一点,但在我的情况下,数据是异步变化的,所以我不能只在调用setData()时刷新项。

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

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

  • 当索引进入视图时
  • 每当它发生变化(带有dataChanged()信号),同时索引可见

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

可能的顺序

UI

  1. 单元格进入视图
  2. 查看呼叫model.data(cell, Qt::DisplayRole)
    • 将单元格添加到计划索引集(如果尚未计划)
    • 返回旧数据或默认数据
  3. 数据异步更新,发出dataChanged()
  4. 其中一个单元格在视图中,视图将再次调用model.data()-循环返回步骤2,或者该单元格不可见,序列到此结束

数据线程

  1. 每X毫秒更新所有计划索引(清除集合)

这将满足您连续/异步轮询可见模型项的要求。