Состояние QML изменяется в предложении «когда» устанавливает состояние по умолчанию - PullRequest
0 голосов
/ 10 апреля 2020

Когда используется условие when состояния QML, оно иногда проходит через состояние по умолчанию ("") перед переходом в конечное состояние:

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 изменяет состояние с NOTPRESSED на "" перед установкой целевого состояния PRESSED?

Я проверял это компонент с Qt 5.14.1 и 5.15.

1 Ответ

1 голос
/ 10 апреля 2020

Состояние "" означает освобождено . Если вы введете в свой код это:

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

Вы увидите, что "" будет изменено на выпущено .

Мой вывод, если кому-то нужно:

qml: State: NOTPRESSED
qml: State: released
qml: State: PRESSED
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...