QML: StackView和c++绑定变量

QML: StackView and C++ bound variables

本文关键字:绑定 变量 c++ StackView QML      更新时间:2023-10-16

使用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})

,其中itemobj1。它可以工作,我可以很容易地为过渡添加动画。

问题在我的对象内部。其中一些有一些绑定到c++的变量,我用它们来更新UI,例如:

property int itemSize: MyClass.itemSize
onItemSizeChanged {
    // do something
}

在迁移到StackView之前,我的所有对象都是在启动时创建的,它们是"活的",因此它们正在侦听itemSize的更改。现在它们只在它们可见时才会监听,所以它们不会做我需要的"某些事情",因为更改可能已经发生了(即我在启动时从设置文件中读取)。

一种解决方案是在Component.onCompleted事件中调用c++方法来请求变量的最后更新。它可以工作,但是我将失去绑定变量的好处。

还有其他聪明的方法吗?例如,在组件加载时自动强制更新绑定的变量

在大多数情况下您不应该需要Component.onCompleted -事件。如果你需要它,当你不使用StackView时,你很可能已经需要它了。

为什么?因为这种可能性很高,你可能会重构你的代码,用绑定的方式,而不是信号处理。
当然,这可能在任何情况下都不可能,但是(没有证据)我猜99%的情况下,您不需要Component.onCompleted -事件应该是可以重构的。

如果您使用信号处理程序来设置变量(包括Component.onCompleted -信号),它会变得越来越非声明性,您可能会尝试避免。

在事件处理程序中设置属性,例如Component.onCompleted通常不会绑定(除非您使用Qt.binding(function() {return value}),否则可能导致进一步的问题)。

相反,如果您需要对valueChanged -信号做出反应,请考虑在Component.onCompleted中手动触发此信号,而不是初始化该值,以避免由于忘记绑定而导致的错误。

Component.onCompleted: {
    somePropertyChanged()
    someOtherPropertyChanged()
    ......
}

但是,您应该尝试的第一个方法是,通过将(有条件地)直接绑定到值来替换事件处理来解决问题。