我很努力去理解QML状态概念。QML状态不会在C++信号上发生变化
我有以下代码:
import QtQuick 2.1
import QtQuick.Controls 1.0
Rectangle{
id: myRectangle
width: 500
height: 120
state: "init"
Button {
id: myBtn1
text: "hello"
anchors.right: parent.right
anchors.rightMargin: 40
anchors.verticalCenter: parent.verticalCenter
onClicked: {
console.log("trying to change state to myState "
myRectangle.state = "customState"
}
}
Button {
id: myBtn2
text: "bye"
anchors.right: parent.right
anchors.rightMargin: 40
anchors.verticalCenter: parent.verticalCenter
onClicked: {
myCppObject.coolFunction()
}
visible: false
}
Connections {
target: myCppObject
onCoolSignal: {
console.log("signal triggered")
console.log("state before signal: " + myRectangle.state);
myRectangle.state = "init";
console.log("state after signal: " + myRectangle.state);
}
}
states: [
State {
name: "init"
PropertyChanges {
target: myBtn1
visible:true
}
PropertyChanges {
target: myBtn2
visible: false
}
},
State {
name: "customState"
PropertyChanges {
target: myBtn1
visible: false
}
PropertyChanges {
target: myBtn2
visible: true
}
}
]
}
我的意图是,在点击“myBtn1”这个按钮应该会消失,“myBtn2”应该显示。因此,我使用所描述的状态,到目前为止它工作!状态改变并且标签“bye”的按钮可见。
在接下来的步骤中,点击按钮“myBtn2”调用“myCppObject”的函数“coolFunction”,其目的仅仅是发出一个叫做“coolSignal”的信号 - 它也可以工作! 我的问题是,我得到预期的输出是一样的控制台:
signal triggered
state before signal: customState
state after signal: init
但“myBtn1”保持隐藏和“myBtn2”保持可见!所以国家并没有真正改变! 任何想法我不了解QML中的状态?
btw:如果我将myBtn2.onClick
更改为myRectangle.state = "init";
状态转换工作!但我真的需要它发生在一个自定义的C++信号上!
感谢您提前提供任何帮助。
编辑: 我忘了说,我不使用main.qml顶部写的源代码。它位于一个名为MyElem.qml的额外QML文件中,该文件用作listview的委托elem。这意味着运行时有多个MyElem被加载,并且它们都具有相同的id(myRectangle)。这是我没有看到任何视觉变化的原因吗?
我刚才发现,不仅连接中的信号变化没有可见的效果,而且还有其他所有可见的效果,比如'myBtn .visible = false'。那么我需要以某种方式重新渲染矩形? – Chriffer
我现在有同样的问题。你解决了这个问题吗? –