Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt “上的QML状态更改”;什么时候;子句设置默认状态_Qt_Qml - Fatal编程技术网

Qt “上的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 },

当使用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
这里是一个布尔值,因此无论其值是什么,
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)
        }
    }