标题:QML的ListModel::move实现机制是什么,怎么实现ListView中的item拖动
作者:nifh80s126
日期:2011-10-21 16:11
内容:
我实现一个ListView,关联一个ListModel和一个delegate,实现了ListView中的item拖动来交换相邻两个item,本来是用ListModel::move可以轻松实现,但无奈这个move函数会瞬间把item位置对齐,我不能控制item的位置,即使自己控制住,在move的瞬间item还是会闪一下,因此我想重新实现这个move,只让它交换listmodel中需要交换的ListElement的数据,但结果是item顺序似乎没变,listview没有更新,那么究竟能不能只交换element的数据?如果可以,那么如何在交换数据后让listview马上更新?如果不可以,那么又该怎么做呢?请不吝赐教!
#1 回 楼主(nifh80s126) 的帖子 [wxj120bw 10-25 22:43]
兄弟 你这个问题解决了没有
#2 回 1楼(wxj120bw) 的帖子 [nifh80s126 10-27 13:16]
item的拖动解决了,定义的delegate中的item,其MouseArea对象设置drag属性。我现在的方法是item长按事件中设置drag.target为当前item的id,再把listview的interactive属性置为false,这样就可以实现item的拖动。拖动过程中如果要实现交换,就用ListModel::move,但你在拖动过程中不能调用move,因为会闪一下(ListView在move这些item时会自己把item置到对齐位置),我只能在最后拖动结束后使每个item都对齐了以后再调用move,这样就不会闪了。这个过程需要一系列的控制来改变item的位置(通过自定义动画,需要自己做好同步),需要记录被拖动的item的索引,listmodel自带一个index属性,还需要记录最后一个需要交换的index,在最后位置都对齐后交换两个index即可(因为这个拖动过程中只有被拖动的item的index会改变,其余的item的index只能是加1或减1,所以只需控制被拖动项和最终目标即可)。
#3 回 2楼(nifh80s126) 的帖子 [wxj120bw 10-27 13:50]
说明的很详细 有时间得尝试下