列表拖动排序在很多应用中都存在, 在 Qt Quick 中如何实现呢。网上查了下没有太多相关资料,于是决定自己写一个。
原理
MouseArea 中可以可以设置 DragEvent 来对某个 Item 进行拖动。Drag 这个类一般附着在可能被拖动的 Item 上,用来设置相关的信息。它提供了很多附加属性。如
- Drag.active: bool 这个属性用来指示控件是否正在被拖动。可以用来绑定 MouseArea 的 MouseArea::drag 属性,当用户拖动鼠标的时候就会产生 drag 事件。
- Drag.target : Object 当 active 为 true (拖动处于活跃状态)时,这个属性保存最后一个被拖动的 dragged item。
DropArea 定义了一个可以接收拖放的区域。它的 entered 信号在有物体被拖入区域时发射,exited 信号在物体被拖出区域时发射,当物体在区域内被拖着来回移动时会不断发射 positionChanged 信号,当用户释放了物体,dropped 信号被发射。
在这个例子中,我们需要在整个 ListView 中填充一个 DropArea 用来接收释放的 Item。Item 中绑定 MouseArea 的 drag 事件。释放的时候计算相应的位置并把拖动位置的 Item 移到释放位置。需要注意的是列表滚动之后要加上滚动的距离。
实现
1 | Item { |