QML:StackView和C ++绑定变量

时间:2016-11-14 16:56:13

标签: c++ qml components qt5

使用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 ++方法来请求最后更新变量。它会起作用,但我会失去绑定变量的好处。

还有其他聪明的方法吗?即自动强制更新组件负载上的绑定变量。

1 个答案:

答案 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 )直接绑定到值来解决问题。