我有一个UI元素,在我进行计算时出现,并在计算完成时消失 . 出现和消失是动画的 . 动画将项目的 implicitHeight
从 0
设置为 X
,反之亦然 . 这些物品作为代表居住在 ListView
中 . ListView
作为此组件的根元素包装在 Item
中 . 此根元素的 implicitHeight
依赖于,也就是绑定到 ListView
的 contentHeight
. 此根元素的宽度设置在使用组件的位置 . 在这里,您可以在代码中看到我的解释:
Item {
id: _root
implicitHeight: _listView.contentHeight
ListView {
id: _listView
width: _root.width
height: contentHeight
delegates: AnimatingItem {
// ...
}
}
}
代码中的 AnimatingItem
已预定义 height
(对于所有人来说不一定相同) . 我写了一个小的调试代码片,它基本上按下按钮将 ListView
的 contentHeight
, childrenRect.height
, height
和根项目的 implicitHeight
写入控制台 .
在大多数情况下,当我按下此按钮打印出这些值时,例如在项目存在时的计算期间(= X
),或者当没有计算因此项目被隐藏(= 0
)时,它们都匹配 .
在某些情况下,当我做一些非常繁重的计算时,即使UI冻结/丢弃帧并且计算完成并且我按下调试按钮所有 ListView
的值匹配(= 0
),但项目的 implicitHeight
不同(= X
) . 奇怪的是 AnimatingItem
或者换句话说 ListView
消失了,因此没有可见的项目,但是如果我将 Rectangle
锚定到这个项目的顶部,那么它将漂浮在空中而不是随着 ListView
消失而向下移动 .
是否有可能如果我有一个非常繁重的计算,一个或多个绑定可以“忘记”由于丢帧而更新?
1 回答
在某些平台上,动画不会在专用线程中运行,但我认为不是Mac OS的情况 . 因此,由于缺乏图形性能而丢弃帧不应导致绑定评估中的跳过 . 现在,如果你有一个CPU热点作为丢帧的原因,那就是另一回事了 . 动画同步到事件循环速率以及场景图形速率,因此如果您的事件循环停止,那么它根本就不会使值更改,这就是您没有获得重新评估的原因 .
根据经验,你应该在main / gui线程中进行大量计算 . 如果它导致GUI冻结超过10毫秒,则需要将其卸载到专用线程,并异步更新结果 . 不要失速或阻止gui线程!
此外,在许多情况下,绑定到
contentHeight
对我来说没有预期效果 . 已证明有效的是绑定到contentItem.childrenRect.height
. 此外,如果根项目只是一个空项目,则它是完全冗余的,但即使它具有直接子项,也可以使用列表视图(也是Item
)来完成 .如果您将视图缩放到完整高度,我建议使用带有
Repeater
的Column
. 一个简单的中继器将利用所有的模型功能和效率,所以不用担心 .