• 8214阅读
  • 3回复

[提问]QML的ListModel::move实现机制是什么,怎么实现ListView中的item拖动 [复制链接]

上一主题 下一主题
离线nifh80s126
 
只看楼主 倒序阅读 楼主  发表于: 2011-10-21
我实现一个ListView,关联一个ListModel和一个delegate,实现了ListView中的item拖动来交换相邻两个item,本来是用ListModel::move可以轻松实现,但无奈这个move函数会瞬间把item位置对齐,我不能控制item的位置,即使自己控制住,在move的瞬间item还是会闪一下,因此我想重新实现这个move,只让它交换listmodel中需要交换的ListElement的数据,但结果是item顺序似乎没变,listview没有更新,那么究竟能不能只交换element的数据?如果可以,那么如何在交换数据后让listview马上更新?如果不可以,那么又该怎么做呢?请不吝赐教!
离线wxj120bw

只看该作者 1楼 发表于: 2011-10-25
回 楼主(nifh80s126) 的帖子
兄弟 你这个问题解决了没有
离线nifh80s126
只看该作者 2楼 发表于: 2011-10-27
回 1楼(wxj120bw) 的帖子
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,所以只需控制被拖动项和最终目标即可)。
离线wxj120bw

只看该作者 3楼 发表于: 2011-10-27
回 2楼(nifh80s126) 的帖子
说明的很详细 有时间得尝试下

快速回复
限100 字节
 
上一个 下一个