QTreeView 的可见项目列表

List of visible items from QTreeView

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

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

我知道 this,但在我的例子中,数据是异步更改的,所以我无法仅在调用 setData() 时刷新项目。

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

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

  • 当索引出现时,
  • 每次在索引可见时更改(使用 dataChanged() 信号)

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

可能的顺序

UI

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

数据线程

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

这将满足您 continuously/asynchronously 轮询可见模型项的要求。