Различные анимации перехода между одними и теми же двумя состояниями - PullRequest
2 голосов
/ 23 июня 2011

Можно ли использовать разные анимации перехода между двумя состояниями в компоненте QML? Следующий пример не работает, и программа падает ( ошибка сегментации в Linux):

import QtQuick 1.0

Rectangle {
    id: canvas
    height: 500; width: 600

    Rectangle { id: rect; color: "#04A"; height: 100; width: 100 }

    state: "A"
    states: [
        State { name: "A"; PropertyChanges { target: rect; x: 0; y: 100 } },
        State { name: "B"; PropertyChanges { target: rect; x: 500; y: 100 } }
    ]


    transitions: trans1

    property list<Transition> trans1: [
        Transition {
            NumberAnimation { target: rect; property: "x"; duration: 500 }
        }
    ]

    property list<Transition> trans2: [
        Transition {
            from: "A"; to: "B"
            SequentialAnimation {
                NumberAnimation { target: rect; property: "x"; from: 0; to: -100; duration: 250 }
                NumberAnimation { target: rect; property: "x"; from: 600; to: 500; duration: 250 }
            }
        },
        Transition {
            from: "B"; to: "A"
            SequentialAnimation {
                NumberAnimation { target: rect; property: "x"; from: 500; to: 600; duration: 250 }
                NumberAnimation { target: rect; property: "x"; from: -100; to: 0; duration: 250 }
            }
        }
    ]


    // test script /////////////////////////////////////////////////////////

    Timer { interval: 1000; running: true; onTriggered: canvas.state = "B" }
    Timer { interval: 2000; running: true; onTriggered: canvas.state = "A" }

    // change kind of transition
    Timer { interval: 3000; running: true; onTriggered: canvas.transitions = trans2 }

    Timer { interval: 4000; running: true; onTriggered: canvas.state = "B" }
    Timer { interval: 5000; running: true; onTriggered: canvas.state = "A" }
}

QML-Doc говорит, что свойство transtition имеет значение только для чтения , но обычно этому свойству присваивается список Transition{...} элементов, поэтому он может не может быть действительно только для чтения, не так ли?

Одним из решений было бы использование 4 состояний, например, A1, B1, A2 и B2 и определите переход между A1 и B1, который выглядит как trans1, и другой переход между A2 и B2, который выглядит как trans2. Но я хочу знать, возможно ли что-то подобное без введения новых состояний.


Edit:

Предложение gregschlom об изменении свойств from / to работает, вот пример:

import QtQuick 1.0

Rectangle {
    id: canvas
    height: 500; width: 600

    Rectangle { id: rect; color: "#04A"; height: 100; width: 100 }

    state: "A"
    states: [
        State { name: "A"; PropertyChanges { target: rect; x: 0; y: 100 } },
        State { name: "B"; PropertyChanges { target: rect; x: 500; y: 100 } }
    ]


    property int transType: 1

    transitions: [
        Transition {
            from: transType == 1 ? "*" : "none"
            to:   transType == 1 ? "*" : "none"
            ParallelAnimation {
                RotationAnimation { target: rect; property: "rotation"; from: 0; to:360; duration: 500 }
                NumberAnimation { target: rect; property: "x"; duration: 500 }
            }
        },
        Transition {
            from: transType == 2 ? "*" : "none"
            to:   transType == 2 ? "*" : "none"
            NumberAnimation { target: rect; property: "x"; duration: 500 }
        }
    ]


    // test script /////////////////////////////////////////////////////////

    Timer { interval: 1000; running: true; onTriggered: canvas.state = "B" }
    Timer { interval: 2000; running: true; onTriggered: canvas.state = "A" }

    // change kind of transition
    Timer { interval: 3000; running: true; onTriggered: canvas.transType = 2 }

    Timer { interval: 4000; running: true; onTriggered: canvas.state = "B" }
    Timer { interval: 5000; running: true; onTriggered: canvas.state = "A" }
}

1 Ответ

2 голосов
/ 01 июля 2011

Следующий пример не работает, и программа падает (ошибка сегментации в Linux):

Пожалуйста, сообщите о таких сбоях как https://bugreports.qt.io. Сбои имеют максимальный приоритет и обычно исправляются в течение нескольких дней.

QML-Doc говорит, что свойство transtition доступно только для чтения, но обычно этому свойству присваивается список элементов Transition {...}, поэтому оно не может быть действительно доступно только для чтения, не так ли?

Я думаю, что назначение во время выполнения (то есть: в скрипте) отличается от назначения в вашем файле qml, поэтому, когда говорят "только для чтения", возможно, они подразумевают, что вы не должны изменить значение после его инициализации.

В любом случае, если документ говорит, что он доступен только для чтения, и он вылетает при попытке записи в него, то вы знаете, что, вероятно, вы не должны это делать ...:)

Но я хочу знать, возможно ли что-то подобное без введения новых состояний.

В документе qml о переходах написано:

Если указано несколько переходов, для любого конкретного изменения состояния будет применяться только один (наиболее подходящий) переход. В приведенном выше примере при изменении состояния1 будет использован первый переход, а не более общий второй переход.

Таким образом, вы можете попытаться определить все свои переходы одновременно и динамически изменить настройки «на» и «из», чтобы попытаться включить / отключить переход. Не уверен, что это возможно, но это может сработать.

...