import QtQuick 2.0 Rectangle { id: root width: 200 height: 200 property int duration: 100 property int count: grid.count Component { id: myDelegate Rectangle { id: wrapper property string nameData: name property bool removalStarted: false property real minX: 0 property real minY: 0 onXChanged: if (removalStarted) grid.recordPosition(x, y) onYChanged: if (removalStarted) grid.recordPosition(x, y) objectName: "wrapper" width: 80 height: 80 border.width: 1 Column { Text { text: index } Text { text: wrapper.x + ", " + wrapper.y } Text { id: textName objectName: "textName" text: name } } color: GridView.isCurrentItem ? "lightsteelblue" : "white" GridView.onRemove: SequentialAnimation { PropertyAction { target: wrapper; property: "removalStarted"; value: true } PropertyAction { target: wrapper; property: "GridView.delayRemove"; value: true } NumberAnimation { target: wrapper; property: "scale"; to: 0.5; duration: root.duration; easing.type: Easing.InOutQuad } PropertyAction { target: wrapper; property: "GridView.delayRemove"; value: false } PropertyAction { target: grid; property: "animationDone"; value: true } } } } GridView { id: grid property int displaceTransitionsDone: 0 property bool animationDone: false property point minimumPosition: Qt.point(0, 0) signal delegateMoved(real x, real y) objectName: "grid" focus: true anchors.fill: parent cacheBuffer: 0 cellWidth: 80 cellHeight: 80 model: testModel delegate: myDelegate displaced: Transition { id: transition SequentialAnimation { NumberAnimation { properties: "x,y" duration: root.duration easing.type: Easing.OutBounce } ScriptAction { script: grid.displaceTransitionsDone += 1 } } } function recordPosition(index, x, y) { if (x < minimumPosition.x || y < minimumPosition.y) { minimumPosition = Qt.point(x, y) } } } Rectangle { anchors.fill: grid color: "lightsteelblue" opacity: 0.2 } }