[QML] смена родителя с анимацией



  • import QtQuick 2.0
    
    Item {
        width: 200; height: 100
    
        Rectangle {
            id: redRect
            width: 100; height: 100
            color: "red"
        }
    	
    	Rectangle {
    		id: greenRect
    		x: 100
    		width: 100; height: 100
    		color: "green"
    	}
    
        Rectangle {
            id: blueRect
    		parent: greenRect
            width: 50; height: 50
            color: "blue"
    		z: 1
    		Behavior on x {
    			ScriptAction { script: console.log("x changed") }
    		}
    		function changeParent() {
    			blueRect.parent = blueRect.parent == redRect ? greenRect : redRect
    			blueRect.x = 0
    			blueRect.y = 0
    		}
            MouseArea { anchors.fill: parent; onClicked: blueRect.changeParent() }
    		
        }
    }
    

    Пример взял отсюда, но немного переработал. В том примере смена родителя происходит с использованием ParentChange, где и указываются новые координаты, а сама анимация с помощью ParentAnimation. При смене родителя прямоугольник плавно перемещается в новое положение, даже если использовать координаты 0, 0. Но в моем примере я не могу использовать states (если родителей будет 100, нужно будет отдельный State для каждого родителя). Код, который я привел выше, не реагирует на смену свойства x, только если присваивать отличный от 0. Я пробовал сначала повесить поведение на свойство parent

    Behavior on parent { 
        ParentAnimation {
            NumberAnimation { properties: "x,y"; duration: 1000 }
        }
    }
    

    но это тоже не помогло. Само поведение срабатывает, но никакой анимации нету, переход резкий.

    Я так понял, вся причина в ParentChange, который удерживает старые координаты Item'а, и в котором мы можем прописать новые. Благодаря этому и происходит анимация. Но я не могу использовать ParentChange, поскольку должен обойтись без states.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.