QTreeView 的可见项目列表
List of visible items from QTreeView
获取 QTreeView 显示的当前可见项列表的最佳方法是什么?是否可以在更改时收到通知?
我的模型的数据可以与应用程序异步更改(数据来自硬件寄存器)。刷新数据可能很慢,所以我想在专用线程中定期刷新。我不想刷新所有项目,因为它会非常低效,只刷新可见的项目。
我知道 this,但在我的例子中,数据是异步更改的,所以我无法仅在调用 setData() 时刷新项目。
忽略视图并专注于模型可能更容易。
您可以在一个简单的 refresh-ahead 缓存上对其进行建模:.data() return 是最后一个已知值,但也会安排更新。由于视图将调用 model.data(index)
- 当索引出现时,
- 每次在索引可见时更改(使用
dataChanged()
信号)
这可以形成一个循环来轮询可见项。当单元格不可见时,视图将停止调用 .data() ,从而终止循环。
您还应该考虑到 data()
可以在此循环之外调用,因此不会中断。
可能的顺序
UI
- 单元格进入视野
- 查看来电
model.data(cell, Qt::DisplayRole)
:
- 将单元格添加到预定索引集(如果尚未预定)
- return 旧数据或默认数据
- 数据异步更新,发出
dataChanged()
- 任一单元格在视图中,视图将再次调用
model.data()
- 循环回到步骤 2,或者单元格不可见,序列到此结束。
数据线程
- 每隔 X 毫秒更新所有计划的索引(清除集合)。
这将满足您 continuously/asynchronously 轮询可见模型项的要求。
获取 QTreeView 显示的当前可见项列表的最佳方法是什么?是否可以在更改时收到通知?
我的模型的数据可以与应用程序异步更改(数据来自硬件寄存器)。刷新数据可能很慢,所以我想在专用线程中定期刷新。我不想刷新所有项目,因为它会非常低效,只刷新可见的项目。
我知道 this,但在我的例子中,数据是异步更改的,所以我无法仅在调用 setData() 时刷新项目。
忽略视图并专注于模型可能更容易。
您可以在一个简单的 refresh-ahead 缓存上对其进行建模:.data() return 是最后一个已知值,但也会安排更新。由于视图将调用 model.data(index)
- 当索引出现时,
- 每次在索引可见时更改(使用
dataChanged()
信号)
这可以形成一个循环来轮询可见项。当单元格不可见时,视图将停止调用 .data() ,从而终止循环。
您还应该考虑到 data()
可以在此循环之外调用,因此不会中断。
可能的顺序
UI
- 单元格进入视野
- 查看来电
model.data(cell, Qt::DisplayRole)
:- 将单元格添加到预定索引集(如果尚未预定)
- return 旧数据或默认数据
- 数据异步更新,发出
dataChanged()
- 任一单元格在视图中,视图将再次调用
model.data()
- 循环回到步骤 2,或者单元格不可见,序列到此结束。
数据线程
- 每隔 X 毫秒更新所有计划的索引(清除集合)。
这将满足您 continuously/asynchronously 轮询可见模型项的要求。