Состояния свойств и переходы в QML

Последнее обновление: 14.01.2024

Qt Quick позволяет определять состояния — конфигурации свойств, в которых значение свойства может меняться в зависимости от различных состояний. Например, кнопка может иметь два состояни: кнопка нажата и кнопка отпущена. Для каждого из этих двух состояний мы можем определить свою конфигурацию свойств:

import QtQuick

Window {
    width: 300
    height: 200
    visible: true
    title: "METANIT.COM"

    Rectangle {
        id:led
        anchors.centerIn: parent
        width: 100
        height: 100
        radius: 50
        color: "green"
        state: "OFF"

        MouseArea {
            anchors.fill: parent
            onPressed: led.state = "ON"
            onReleased: led.state = "OFF"
        }
        // состояния
        states: [
            State {
                name: "ON"
                PropertyChanges { target: led; color: "red"}
            },
            State {
                name: "OFF"
                PropertyChanges { target: led; color: "green"}
            }
        ]
    }
}

Здесь определен элемент Rectangle, внутри которого определена область MouseArea. При нажатии на эту область будет происходить переключение состояния элемента Rectangle - между состояниями ON и OFF:

onPressed: led.state = "ON"
onReleased: led.state = "OFF"

Начальное состояние прямоугольника задано через свойство state, и по умолчанию это состояние OFF:

state: "OFF"

С помощью свойства states определяется набор состояний прямоугольника. Каждое состяние представлено типом State и определяет пару свойств - имя состояния и свойство PropertyChanges, которое задает значения свойств для этого состояния.

State {
    name: "ON"
    PropertyChanges { target: led; color: "red"}
}

То есть в данном случае мы сообщаем, что в состоянии "ON" свойство "color" элемента "led" будет иметь значение "red". (то есть элемент окрасится в красный цвет).

Таким образом, при нажатии Rectangle перейдет в новое состояние, при котором его цвет изменится на красный:

состояния свойств State в QML и Qt Quick

Переходы

Для организации переходов между значениями свойств, заданных с помощью состояний, применяется тип Transition. Для настройки перехода этот тип предоставляет ряд свойств:

  • animations: список анимаций, которые выполняются при переходе

  • enabled: применяется ли данный объект перехода (если равно true, то применяется)

  • from: из какого состояния выполняется переход

  • reversible: указывает, следует ли выполнять обратный переход, если условие перехода изменится

  • running: хранит булевое значение, которое указывает, выполняется ли переход

  • to: в какое состояние выполняется переход

Так, изменим предыдущий пример, применив переходы между состояниями:

import QtQuick

Window {
    width: 250
    height: 200
    visible: true
    title: "METANIT.COM"

    Rectangle {
        id:led
        anchors.centerIn: parent
        width: 100
        height: 100
        radius: 50
        color: "green"
        state: "OFF"

        MouseArea {
            anchors.fill: parent
            onPressed: led.state = "ON"
            onReleased: led.state = "OFF"
        }
        // состояния
        states: [
            State {
                name: "ON"
                PropertyChanges { target: led; color: "red"}
            },
            State {
                name: "OFF"
                PropertyChanges { target: led; color: "green"}
            }
        ]
        // переходы
        transitions: [
            Transition {
                from: "ON"
                to: "OFF"
                ColorAnimation { target: led; duration: 500}
            },
            Transition {
                from: "OFF"
                to: "ON"
                ColorAnimation { target: led; duration: 500}
            }
        ]
    }
}

Здесь определено два перехода - от состояния ON к состоянию OFF и обратно. В обоих случаях выполняется анимация ColorAnimation, которая анимирует цвет в пределах 500 миллисекунд.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850