gpt4 book ai didi

qt - "when"子句设置默认状态的 QML 状态更改

转载 作者:行者123 更新时间:2023-12-02 02:55:55 25 4
gpt4 key购买 nike

当使用 QML 状态的 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 这里是一个 bool 值,所以无论它的值如何,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 在设置目标状态 PRESSED 之前将状态从 NOTPRESSED 更改为 ""

我已经使用 Qt 5.14.1 和 5.15 测试了该组件。

最佳答案

编辑:这是一个 QT 错误 https://bugreports.qt.io/browse/QTBUG-86695

--

when 的问题启用默认未命名状态的子句 ""在某些情况下,即使它没有出现在状态列表中也不特定于 Button 。如果您有多个状态以及状态之间的转换,则通常不能使用 when在此错误修复之前不再使用子句。

如果您只有两个状态,您可以避免未命名的 ""默认状态如下:

  1. 将默认状态放在状态数组的末尾并
  2. 指定 when: 1 == 1 (如果不需要支持QT 5.12也可以在这里写when: true)。

要了解此解决方法如何解决 OP 问题,请考虑以下示例(故意不使用 Button 来表明该问题更为普遍,并且与 Button 的 released 状态无关):

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

在 QT 5.12.9 中,单击两次会产生以下输出(启动时的第一行)

qml: state: false toggle: false
qml: state: true toggle: true
qml: state: false toggle: false

在 QT 5.15.2 中,单击两次会产生以下输出(启动时的第一行)

qml: state: false toggle: false
qml: state: toggle: true
qml: state: true toggle: true
qml: state: false toggle: false

所以切换形式toggle: falsetoggle: true经历 "" QT 5.15.2中的默认状态而不是直接到"true"状态。如果更改状态定义的顺序,则其他状态更改会经历 "" 。看起来有那么一刻 when "false" 的条款状态是false ,但是"true"的when子句状态不是true还没有。

在 QT 5.15.2 中指定 when: true关于"false “状态有效,即状态切换如 QT 5.12.9 中所示,并且从不应用默认的未命名 "" 状态。但是此解决方法会在 QT 5.12.9 中产生错误(无效的属性分配:不支持的类型“QQmlBinding*”)(我也需要支持)。 when: 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)
}
}

关于qt - "when"子句设置默认状态的 QML 状态更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61139425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com