Qt “上的QML状态更改”;什么时候;子句设置默认状态
当使用QML状态的Qt “上的QML状态更改”;什么时候;子句设置默认状态,qt,qml,Qt,Qml,当使用QML状态的When子句时,它有时会先经过默认状态(“”),然后再进入最终状态: import QtQuick 2.14 import QtQuick.Controls 2.14 Button { id: root width: 30 height: 30 states: [ State { name: "PRESSED" when: pressed },
When
子句时,它有时会先经过默认状态(“”
),然后再进入最终状态:
import QtQuick 2.14
import QtQuick.Controls 2.14
Button {
id: root
width: 30
height: 30
states: [
State {
name: "PRESSED"
when: pressed
},
State {
name: "NOTPRESSED"
when: !pressed
}
]
onStateChanged: {
console.log("State: " + state);
}
}
pressed
这里是一个布尔值,因此无论其值是什么,onStateChanged()
都应该使用我定义的状态之一触发。但在这里,输出是:
$ qmlscene ./Button.qml
qml: State: NOTPRESSED
qml: State:
qml: State: PRESSED
qml: State: NOTPRESSED
qml: State:
qml: State: PRESSED
qml: State: NOTPRESSED
qml: State:
qml: State: PRESSED
qml: State: NOTPRESSED
为什么在设置目标状态之前,Qt会将状态从未按下
更改为”
我已经用Qt5.14.1和5.15测试了这个组件。状态“意味着。如果在代码中输入以下内容:
State {
name: "released"
when: root.released
}
完整代码:
Button {
id: root
autoRepeat: true
anchors.fill: parent
states: [
State {
name: "PRESSED"
when: root.pressed
},
State {
name: "NOTPRESSED"
when: !root.pressed
},
State {
name: "released"
when: root.released
}
]
onStateChanged: {
console.log("State: " + state);
}
}
您将看到,“将被更改为已发布
我的输出,如果有人需要:
编辑:这是一个QT错误
--
“when”子句在某些情况下启用默认未命名状态时出现的问题,即使它没有出现在列表中,也不是特定于按钮。如果您有多个状态以及状态之间的转换,在修复此错误之前,通常不能再使用when子句
如果您只声明了两种,则可以避免未命名的“
默认状态,如下所示:
when:1==1
(如果不需要支持QT 5.12,也可以在此处编写when:true
)查看此解决方案如何修复OPS问题,请考虑下面的示例(故意不使用按钮来显示问题更一般,且与<代码>发布的按钮状态无关):
在QT 5.12.9中,单击两次会产生以下输出(启动时的第一行) 在QT 5.15.2中,单击两次会产生以下输出(启动时的第一行) 因此,在Qt5.15.2中,从toggle:false
切换到toggle:true
要经过“
默认状态,而不是直接切换到“true”
状态。如果更改状态定义的顺序,另一个状态更改将通过“
”。看起来有一个时刻,“false”
状态的when
子句是false
,但是“true”
状态的when子句还不是true
在QT 5.15.2中,在“false
”状态上指定何时:true
,即状态切换如QT 5.12.9中所示,默认的未命名“
状态从不应用。但是这个解决方法在Qt5.12.9中产生了一个错误(无效的属性分配:不支持的类型“QQmlBinding*”)(我也需要支持)。当:1==1时,可通过避免此错误。这是我最后的解决办法:
Item {
id: item
anchors.fill: parent
property bool toggle
Button {
anchors.fill: parent
onClicked: item.toggle = ! item.toggle
}
states: [
State {
name: "true"
when: item.toggle
},
State {
name: "false"
when: 1 == 1
}
]
onStateChanged: {
console.log("state:", state, "toggle:", toggle)
}
}
Item {
id: item
anchors.fill: parent
property bool toggle
Button {
anchors.fill: parent
onClicked: item.toggle = ! item.toggle
}
states: [
State {
name: "true"
when: item.toggle
},
State {
name: "false"
when: ! item.toggle
}
]
onStateChanged: {
console.log("state:", state, "toggle:", toggle)
}
}
qml: state: false toggle: false
qml: state: true toggle: true
qml: state: false toggle: false
qml: state: false toggle: false
qml: state: toggle: true
qml: state: true toggle: true
qml: state: false toggle: false
Item {
id: item
anchors.fill: parent
property bool toggle
Button {
anchors.fill: parent
onClicked: item.toggle = ! item.toggle
}
states: [
State {
name: "true"
when: item.toggle
},
State {
name: "false"
when: 1 == 1
}
]
onStateChanged: {
console.log("state:", state, "toggle:", toggle)
}
}