Qt Quick 1.1:如何删除QML列表视图中的元素?

时间:2013-09-09 15:06:24

标签: qt listview animation qml qt-quick

在我的应用程序UI中,我在QML listview中显示了许多元素,当其中一个元素被删除时,它应该以动画方式向上滑动到其上方的元素后面。实现此目的的代码与Qt文档中的this sample非常相似,只是我为y坐标而不是scale设置动画,我需要递减z值才能生成确保元素在后面向上滑动,而不是在它上面的元素前面滑动:

Component {
    id: delegate
    Item {
        ListView.onRemove:
            SequentialAnimation {
                // enable delayed removal
                PropertyAction {
                    target: wrapper
                    property: "ListView.delayRemove"
                    value: true
                }
                // make box slide up behind rather
                // than in front of the box above
                PropertyAction {
                    target: wrapper
                    property: "z"
                    value: wrapper.z - 1
                }
                NumberAnimation {
                    target : wrapper
                    property : "y"
                    from : wrapper.y
                    to   : wrapper.y - wrapper.height
                    duration    : style.removeTransitionDuration
                    easing.type : style.removeTransitionType
                }
                // disable delayed removal
                PropertyAction {
                    target: wrapper
                    property: "ListView.delayRemove"
                    value: false
        }
    }
}

这段代码基本上有效,但有一个巨大的缺陷:当被删除的元素向上滑动时,它下面的元素保持原样,只有在元素完全消失后才“跳起”到新的位置。我希望它们向上移动,同时被移除的元素向上滑动。

我已尝试通过将y指定为Behavior on yPropertyAnimation方向中的任何元素移动动画,如this sample所示;这在y属性明确设置时有效(例如在MouseArea::onClicked处理程序中),但是当y因删除元素而隐含地更改时没有动画。

我还尝试动画其他属性,例如heightscale,就像Dynamic List ListView Example中所做的那样,并将其与opacity相结合,但因为元素有点复杂,结果看起来很简单 - 设计部门非常具体,因为该元素确实应该向上滑动。

如何向下滑动元素?这在Qt 4.8 / Qt Quick 1.1中是否可行?关于这个具体问题,Qt 5 / Qt Quick 2.0有什么改进吗?

1 个答案:

答案 0 :(得分:3)

ListView在Qt Quick 2.0中有一些新属性:

  1. remove:“此属性包含应用于从视图中删除的项目的转换。”
  2. removeDisplaced:“此属性包含应用于视图中因删除视图中的其他项而取代的项目的转换。”
  3. removeDisplaced应该是您要查找的属性。不幸的是,我不知道Qt Quick 1.0的方法。