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