使用Qt5.7,我使用StackView在几个QML Objects
:
StackView {
id: stack
anchors.fill: parent
initialItem: initObj
}
Component {
id: initObj
ModuleHome {}
}
Component {
id: obj1
Module1 {}
}
// ...
stack.push({item: item, replace: true, destroyOnPop: true})
其中item
即obj1
。
它可以工作,我可以轻松地为过渡添加动画。
问题出在我的对象中。 其中一些变量有一些绑定到C ++的变量,我用它来更新UI,即:
property int itemSize: MyClass.itemSize
onItemSizeChanged {
// do something
}
在迁移到StackView
之前,我的所有对象都是在启动时创建的,并且它们是“活着的”,因此他们正在监听itemSize
的更改。
现在他们只有在可见时才会收听,所以他们不会做我需要的“东西”,因为这些变化可能已经发生(即我在启动时从设置文件中读取)。
一种解决方案是在Component.onCompleted
事件中调用C ++方法来请求最后更新变量。它会起作用,但我会失去绑定变量的好处。
还有其他聪明的方法吗?即自动强制更新组件负载上的绑定变量。
答案 0 :(得分:1)
在大多数情况下,您不应该需要Component.onCompleted
- 事件。
如果您需要它,当您不使用StackView
时,您很可能已经需要它。
为什么呢?因为可能性很高,所以您可能以一种使用绑定的方式重构代码,而不是信号处理。
当然,这在任何情况下都是不可能的,但是(没有证据)我猜想99%的不需要Component.onCompleted
- 事件的情况应该可以重构。
如果使用信号处理程序设置变量(包括Component.onCompleted
- 信号),它往往会变得越来越非声明性,您可能会尝试避免这种情况。
设置事件处理程序(例如Component.onCompleted
)中的属性通常不会绑定(除非您使用Qt.binding(function() {return value})
,这可能会导致进一步的问题。
相反,如果您需要对valueChanged
- 信号作出反应,请考虑手动触发Component.onCompleted
,而不是在那里初始化值,以避免因遗忘绑定而导致的错误。
Component.onCompleted: {
somePropertyChanged()
someOtherPropertyChanged()
......
}
但同样:你应该尝试的第一个问题是,通过将事件处理( conditionaly )直接绑定到值来解决问题。