您当前的位置: 首页 > 

龚建波

暂无认证

  • 2浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

QML ListView 鼠标拖拽交换行

龚建波 发布时间:2020-11-16 01:26:53 ,浏览量:2

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

关注
打赏
1655829268
查看更多评论
立即登录/注册

微信扫码登录

0.0383s