2

QMLコンポーネントで2つの状態間で異なる遷移アニメーションを使用することは可能ですか?次の例は機能せず、プログラムがクラッシュします(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{...}このプロパティに割り当てられているため、実際には読み取り専用にすることはできません。

1つの解決策は、、、、などの4つの状態を使用しA1、のように見えるとの間の遷移とB1、のように見えるとの間の別の遷移を定義することです。 しかし、私はこのようなことが新しい状態を導入することなく可能かどうか知りたいです。A2B2A1B1trans1A2B2trans2


編集:

/プロパティを変更するためのgregschlomの提案は、ここでは例として機能します。fromto

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" }
}
4

1 に答える 1

2

次の例は機能せず、プログラムがクラッシュします(Linuxでのセグメンテーション違反)。

そのようなクラッシュをhttps://bugreports.qt.ioに報告してください。クラッシュは最優先され、通常は数日で修正されます。

QML-Docによると、transtitionプロパティは読み取り専用ですが、通常、Transition {...}要素のリストがこのプロパティに割り当てられているため、実際には読み取り専用にすることはできません。

実行時(つまり、スクリプトで)に割り当てることは、 qmlファイルで割り当てることとは異なると思います。したがって、「読み取り専用」と言う場合は、初期化された後は値を変更しないことを意味している可能性があります

とにかく、ドキュメントに読み取り専用と書かれていて、書き込もうとするとクラッシュする場合は、おそらくそれを行うべきではないことがわかります... :)

しかし、私はこのようなことが新しい状態を導入することなく可能かどうか知りたいです。

トランジションに関するqmlドキュメントには次のように書かれています。

複数の遷移が指定されている場合、特定の状態変化には単一の(最適な)遷移のみが適用されます。上記の例では、state1に変更すると、より一般的な2番目の遷移ではなく、最初の遷移が使用されます。

したがって、すべてのトランジションを一度に定義し、「to」と「from」の設定を動的に変更して、トランジションの有効化/無効化を試みることができます。可能かどうかはわかりませんが、機能する可能性があります。

于 2011-07-01T09:17:00.507 に答える