Состояние QML: не учитывается, если оно не является дочерним для своей цели - PullRequest
0 голосов
/ 14 сентября 2018

Предполагая, что у меня есть прямоугольник и блок состояния:

import QtQuick 2.0
import QtQuick.Window 2.11
import QtQuick.Controls 1.4



Window{
    id: main
    width: 800
    height: 800
    visible: true
    Item{

    Rectangle {
        id: rect
        width: 100
        height: 100
        color: "red"
        state: "ready"
    }

    states: [
            State {
                name: "ready"
                PropertyChanges {
                    target: rect
                    color: "lightblue"
                    opacity: 0.2
                }
            }
        ]
    }
}

Почему при указании начального State для моего Rectangle на него не влияет вышеуказанное states. Обратите внимание, что блок states находится за пределами Rectangle, я предположил, что поскольку есть цель, нет необходимости помещать ее в блок Rectangle.

1 Ответ

0 голосов
/ 15 сентября 2018

Состояния принадлежат элементу, поэтому, когда вы указываете состояние: «готово» в прямоугольнике ищет состояния прямоугольника, а не состояния других элементов. Итак, у вас есть 2 решения:

1. Установить начальное состояние в окне:

Window{
    id: main
    width: 800
    height: 800
    visible: true
    Item{

        Rectangle {
            id: rect
            width: 100
            height: 100
            color: "red"
        }

        state: "ready"
        states: [
            State {
                name: "ready"
                PropertyChanges {
                    target: rect
                    color: "lightblue"
                    opacity: 0.2
                }
            }
        ]
    }
}

2. Переместите состояния в прямоугольник, чтобы они были их состояниями.

Window{
    id: main
    width: 800
    height: 800
    visible: true
    Item{

        Rectangle {
            id: rect
            width: 100
            height: 100
            color: "red"
            state: "ready"

            states: [
                State {
                    name: "ready"
                    PropertyChanges {
                        target: rect
                        color: "lightblue"
                        opacity: 0.2
                    }
                }
            ]
        }
    }  
}

Если вы хотите, чтобы из другого Предмета было назначено начальное состояние, вы должны использовать ссылку на предмет, в следующем примере состояния принадлежат Предмету с id: it, и затем мы устанавливаем его, когда прямоугольник завершает построение:

Window{
    id: main
    width: 800
    height: 800
    visible: true
    Item{
        id: it
        Rectangle {
            id: rect
            width: 100
            height: 100
            color: "red"
            Component.onCompleted: it.state = "ready"
        }
        states: [
            State {
                name: "ready"
                PropertyChanges {
                    target: rect
                    color: "lightblue"
                    opacity: 0.2
                }
            }
        ]
    }
}
...