Qt Quick 1.1:如何在QML列表视图中删除元素时滑动它们?

7

在我的应用程序UI中,我在QML列表视图中显示许多元素。当其中一个被删除时,它应该以动画方式向上滑动到其上方的元素后面。实现此效果的代码与Qt文档中的此样例非常相似,只是我将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来动画化任何元素的移动,如此示例所示;当显式设置y属性(例如在MouseArea::onClicked处理程序中)时,这是有效的,但是当y因元素被删除而隐式更改时,就没有动画效果了。
我还尝试了动画化其他属性,例如heightscale,就像Dynamic List ListView Example中所做的那样,并将其与opacity相结合,但由于该元素有点复杂,结果看起来非常糟糕 - 设计部门明确表示该元素确实应该向上滑动。
我应该如何让元素向上滑动,同时下面的元素也随之移动?在Qt 4.8 / Qt Quick 1.1中是否可能实现这一点?在解决这个特定问题方面,Qt 5 / Qt Quick 2.0有任何改进吗?
1个回答

3

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

  1. remove:“此属性保存应用于从视图中删除的项目的过渡效果。”
  2. removeDisplaced:“此属性保存应用于视图中由于其他项目的删除而被替换的项目的过渡效果。”

removeDisplaced应该是您要寻找的属性。不幸的是,我不知道在Qt Quick 1.0中是否有这样的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接