我正在努力理解 QML 状态概念。
我有以下代码:
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”应该出现。因此,我使用所描述的状态,并且到目前为止它有效!状态发生变化,带有“再见”标签的按钮可见。
在下一步中,单击按钮“myBtn2”调用“myCppObject”的函数“coolFunction”,其唯一目的是发出一个名为“coolSignal”的信号——这也有效!我的问题是我确实在控制台中得到了预期的输出,就像:
signal triggered
state before signal: customState
state after signal: init
但是“myBtn1”保持隐藏状态,“myBtn2”保持可见!!!所以状态并没有真正改变!!!我对 QML 中的状态不了解的任何想法?
顺便说一句:如果我更改myBtn2.onClick
为myRectangle.state = "init";
状态转换工作!!!但我真的需要它发生在自定义 C++ 信号上!
感谢您提前提供任何帮助。
编辑:我忘了说我不使用写在 main.qml 顶部的源代码。它位于一个名为 MyElem.qml 的额外 QML 文件中,该文件用作列表视图的委托元素。这意味着在运行时加载了多个 MyElem,并且它们都具有相同的 id (myRectangle)。这就是我没有看到任何视觉变化的原因吗?