检查是不是正在绘制 QML 项目
Posted
技术标签:
【中文标题】检查是不是正在绘制 QML 项目【英文标题】:Check if QML Item is being drawn检查是否正在绘制 QML 项目 【发布时间】:2019-10-30 08:14:52 【问题描述】:我有一组 QML 项目分布在我的 UI 中。它们显示来自远程设备的数据,并且它们的内容需要定期更新。 Items
分布在多个选项卡上,并隐藏在嵌套的 ListView
实例中,因此大部分用户不会一直可见。
为了保持低带宽,我只想更新当前对用户可见的项目。
我正在寻找正确的钩子来获取这些Items
中的哪一个当前从项目中显示,而不依赖于父母的信息。如果它们都放在ListView
代表中,我可以使用代表的组件onCompleted
和onDestroyed
信号。由于情况并非如此,我一直在寻找如何获取这些信息。
我在这里遗漏了什么吗?是否有onPaintFinished
信号或类似的东西?我的解决方法是将该逻辑添加到父容器中,但这会很乏味,因为有多种容器可以包含这些显示项。
【问题讨论】:
如果您的部分项目被放置在标签中,那么它们很可能还不存在。 确实如此,因为选项卡被实现为StackLayout
。
好的,所以你可以只更新当前标签的项目。无论如何,最好提供Minimal, Reproducible Example
【参考方案1】:
ListView 委托上的实例将不存在,直到它们位于列表视图可视区域周围的可见范围或缓存范围内。如果委托移动到该范围之外,它就会被销毁。因此,无需担心隐藏在那里的实例。
此外,当前不可见的项目也不会被绘制。它们没有被输入到场景图中,因此不会被渲染。因此,也不会绘制当前非当前选项卡上出现的项目实例。但是,这些项目当然仍然存在。
但是,确定一个项目是否有效可见是一个相当困难的问题。 QML 将其中的一部分委托给 OpenGL(例如裁剪)。没有关于结果的反馈。理论上,您可以从渲染器中提取这些信息,但这需要对其进行自定义,这非常困难。您可以查看GammaRay 用于警告项目不可见的启发式方法。也许你可以从中得到一些启发。
【讨论】:
以上是关于检查是不是正在绘制 QML 项目的主要内容,如果未能解决你的问题,请参考以下文章