Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QTreeView中的可见项列表_C++_Qt_Qtreeview_Qmodelindex - Fatal编程技术网

C++ QTreeView中的可见项列表

C++ QTreeView中的可见项列表,c++,qt,qtreeview,qmodelindex,C++,Qt,Qtreeview,Qmodelindex,获取QTreeView显示的当前可见项目列表的最佳方式是什么?当它发生变化时,有可能得到通知吗 我的模型的数据可以在应用程序中异步更改(数据来自硬件寄存器)。刷新这些数据可能很慢,因此我希望在专用线程中定期刷新。我不想刷新所有项目,因为这将是非常低效的,只有可见的项目 我知道,但在我的例子中,数据是异步更改的,因此我无法仅在调用setData()时刷新项目。忽略视图并关注模型可能更容易 您可以在简单的提前刷新缓存上对其进行建模:.data()返回最后一个已知值,但也会安排更新。因为视图将调用mo

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

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


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

忽略视图并关注模型可能更容易

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

  • 当索引出现时
  • 每次它改变时(使用
    dataChanged()
    信号),同时索引可见
这可以形成一个循环来轮询可见项。当单元格不可见时,视图将停止调用.data(),从而终止循环。 您还应该考虑到可以在此循环之外调用
data()
,因此不会有任何中断

可能序列 用户界面
  • 细胞进入视野
  • 视图调用
    model.data(单元格,Qt::DisplayRole)
    • 将单元格添加到计划索引集(如果尚未计划)
    • 返回旧数据或默认数据
  • 数据异步更新,发出
    dataChanged()
  • 任何一个单元格都在视图中,视图将再次调用
    model.data()
    ——返回到步骤2,或者单元格不可见,序列到此结束
  • 数据线程
  • 每X ms更新所有计划索引(清除集合)

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

    您不需要关心刷新不可见项-例如,当您滚动视图时,模型视图将在视图端口中显示这些项时执行此操作。这就是模型/视图体系结构的美妙之处。我需要刷新模型的数据,异步刷新视图中发生的事情。为此,我从缓慢的硬件寄存器中读取数据——因此是专用线程(当调用data()时,我不能仅仅从寄存器中读取数据,因为这太慢了)。由于我的模型相当大,我只想刷新当前可见项的数据。如果数据与UI不同步,这可能是一个解决方案。我的数据从UI异步更新,即使没有用户与UI交互,我仍然希望看到这些更改,因此我不能依靠UI事件更新我的Qt模型。不,这将每隔50毫秒(+读取时间)轮询UI可见的数据,即使没有交互。它不会更新不可见的数据,但这正是您所要求的。为了更清楚地说明为什么这样做可以解决您的问题,进行了此操作后,即使索引不可见,视图似乎仍会调用我的模型的data()。视图似乎重新计算了行的高度(通过QTreeViewPrivate::itemHeight()),而不管它是否可见。因此,即使项目不可见,它也会调用模型的data()。我不知道setUniformRowHeights()。你的建议有效;非常感谢。