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

ssc*_*ssc 7 animation qt listview qml qt-quick

在我的应用程序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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我试图y通过指定Behavior on y如此示例中PropertyAnimation所示的a来为方向上的任何元素移动设置动画; 当属性被明确设置时(例如在处理程序中),这可以工作,但是由于删除了元素而在隐含更改时没有动画.yMouseArea::onClickedy

我也试过动画其他属性,如heightscale如做动态列表的ListView示例以及结合了opacity,但是作为元素有些复杂,结果一看平原aweful -和设计部门是相当具体的元素真是不应该向上滑动.

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

小智 3

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

  1. remove:“此属性保存应用于从视图中删除的项目的转换。”
  2. removeDisplaced:“此属性保留应用于视图中因删除视图中其他项目而移位的项目的转换。”

removeDisplaced 应该是您正在寻找的属性。不幸的是,我不知道 Qt Quick 1.0 中的方法。