检查是不是正在绘制 QML 项目

Posted

技术标签:

【中文标题】检查是不是正在绘制 QML 项目【英文标题】:Check if QML Item is being drawn检查是否正在绘制 QML 项目 【发布时间】:2019-10-30 08:14:52 【问题描述】:

我有一组 QML 项目分布在我的 UI 中。它们显示来自远程设备的数据,并且它们的内容需要定期更新。 Items 分布在多个选项卡上,并隐藏在嵌套的 ListView 实例中,因此大部分用户不会一直可见。

为了保持低带宽,我只想更新当前对用户可见的项目。

我正在寻找正确的钩子来获取这些Items 中的哪一个当前从项目中显示,而不依赖于父母的信息。如果它们都放在ListView 代表中,我可以使用代表的组件onCompletedonDestroyed 信号。由于情况并非如此,我一直在寻找如何获取这些信息。

我在这里遗漏了什么吗?是否有onPaintFinished 信号或类似的东西?我的解决方法是将该逻辑添加到父容器中,但这会很乏味,因为有多种容器可以包含这些显示项。

【问题讨论】:

如果您的部分项目被放置在标签中,那么它们很可能还不存在。 确实如此,因为选项卡被实现为StackLayout 好的,所以你可以只更新当前标签的项目。无论如何,最好提供Minimal, Reproducible Example 【参考方案1】:

ListView 委托上的实例将不存在,直到它们位于列表视图可视区域周围的可见范围或缓存范围内。如果委托移动到该范围之外,它就会被销毁。因此,无需担心隐藏在那里的实例。

此外,当前不可见的项目也不会被绘制。它们没有被输入到场景图中,因此不会被渲染。因此,也不会绘制当前非当前选项卡上出现的项目实例。但是,这些项目当然仍然存在。

但是,确定一个项目是否有效可见是一个相当困难的问题。 QML 将其中的一部分委托给 OpenGL(例如裁剪)。没有关于结果的反馈。理论上,您可以从渲染器中提取这些信息,但这需要对其进行自定义,这非常困难。您可以查看GammaRay 用于警告项目不可见的启发式方法。也许你可以从中得到一些启发。

【讨论】:

以上是关于检查是不是正在绘制 QML 项目的主要内容,如果未能解决你的问题,请参考以下文章

如何测量 QML 项目自加载以来出现在屏幕上所用的时间?

QML QQuickText:无法锚定到不是父项或兄弟项目的项目

如何在QML项目中显示本地目录中的多个图像?

如何在 MouseArea 拖动上平移 QML 项目

QML 项目未呈现

更改模型后未正确绘制 QML 中继器