QML 的 ListView 本身有 move 过渡(Transition)属性,可以用来做一些交换动画效果。其中 move 为当前项的过渡,moveDisplaced 为被交换项的过渡。鼠标拖拽可以用一个 MouseArea 来实现,当鼠标滑动到相邻行后就调用 model 的 move 接口,这样就会触发 view 的 move 过渡动画。效果如下:
感觉有点生硬,勉强能用。
完整代码如下:
import QtQuick 2.12
import QtQuick.Window 2.12
//演示ListView的拖拽移动
Window {
width: 360
height: 520
visible: true
title: qsTr("ListView Move")
ListModel{
id: list_model
Component.onCompleted: {
for(var i=0;i=0&&from=0&&toto?(to):(to+1));
infoList.swapItemsAt(from,to);
endMoveRows();
}
}
(2021-1-28补充)之前使用 swapItemsAt 只考虑了邻近交换,但是跨行的话 move 触发当前行移动而不是交换,而内存却把两项交换了,所以应该改为 takeAt+insert 来移动选中行到目的行:
void AudioInfoListModel::swapRow(int from, int to)
{
if(from!=to&&from>=0&&from=0&&toto?(to):(to+1));
auto item=allAudio.takeAt(from);
allAudio.insert(to,item);
endMoveRows();
}
}
参照博客:https://blog.csdn.net/anyinxi/article/details/107227336
参照文档:https://doc.qt.io/qt-5/qabstractitemmodel.html#beginMoveRows