QML中鼠标拖动移动ListView中项的位置

2023-10-26

在QML开发中,ListView是我们经常用到的控件,可以用它给用户展示出列表,但是往往都是将项目的显示顺序排好后,直接让ListView显示出来,亦或者是知道要移动到具体的那一位置,然后调整数据在ListView中的顺序来达到要求,现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2

Rectangle {
    width: 800
    height: 600
    ListModel{
        id: objmodel
		ListElement{
            name: "小米"
            cost: "2500"
            manufacturer: "小米公司"
        }
        ListElement{
            name: "苹果"
            cost: "5000"
            manufacturer: "Apple公司"
        }
        ListElement{
            name: "小米2"
            cost: "2000"
            manufacturer: "小米公司"
        }
        ListElement{
            name: "三星"
            cost: "3000"
            manufacturer: "三星公司"
        }
		ListElement{
            name: "华为"
            cost: "3000"
            manufacturer: "华为公司"
        }
		ListElement{
            name: "ViVo"
            cost: "3000"
            manufacturer: "ViVo公司"
        }
    }
    Component {
        id: com_delegate
        Item {
            id: wrapper
            width: parent.width
            height: 30
			Rectangle {
				id: bgColor
				anchors.fill: parent
				color: "transparent"
			}
            Row{
                anchors.left: parent.left
                anchors.verticalCenter: parent.verticalCenter
                spacing: 8
                Text {
                    id: coll
                    text: name
                    color: wrapper.ListView.isCurrentItem? "red":"black"
                    font.pixelSize: 20
                }
                Text {
                    text: cost
                    color: wrapper.ListView.isCurrentItem? "red":"black"
                    font.pixelSize: 20
                }
                Text {
                    text: manufacturer
                    color: wrapper.ListView.isCurrentItem? "red":"black"
                    font.pixelSize: 20
                }
            }
            MouseArea {
                id: mousearea
                anchors.fill: parent
                onClicked: {
					listview.currentIndex = index;
                }
                onPressed: {
                    bgColor.color = "blue"
                }
                onReleased: {
					bgColor.color = "transparent"
                }
                onMouseXChanged: {
                        var pore = listview.indexAt( mousearea.mouseX + wrapper.x, mousearea.mouseY + wrapper.y );
                        if( index != pore ) {
                            objmodel.move( index, pore , 1)
                     }
                }
                onMouseYChanged: {
                       var pore = listview.indexAt( mousearea.mouseX + wrapper.x, mousearea.mouseY + wrapper.y );
                       if( index != pore ) {
                           objmodel.move( index, pore , 1)
                        }
                }
            }
        }
    }
    property int n_flag: 0
    ListView {
        id: listview
		anchors.centerIn:parent
		width: 300
		height: 300
        delegate: com_delegate
        model:objmodel
        interactive: false
        focus: true
       function move_down() {
            if( ( n_flag == 0 ) && ( currentIndex+1 ) < model.count ) {
                model.move( currentIndex, currentIndex+1, 1)
            }
            if( n_flag == 1 && ( currentIndex-1 ) >= 0) {
                model.move( currentIndex, currentIndex-1, 1)
            }
            if( currentIndex -1 == 0 ) {
                n_flag = 0;
            }
            if( currentIndex + 1 == model.count ) {
                n_flag = 1
            }
        }
        move: Transition {
                NumberAnimation { properties: "x,y"; duration: 100 }
        }
    }
    Rectangle {
        anchors.bottom: parent.bottom
        width: 100
        height: 100
        border.width: 0.6
        MouseArea {
            anchors.fill: parent
            onClicked: {
                console.log( listview.currentIndex )
                listview.move_down()
            }
        }
    }
}
鼠标拖动某项到指定的ListView中的某位置,然后放开鼠标,该项就移动到指定位置了。

左下角的框代表一个按钮(虽然丑了点,说明问题就行^__^),点击可以改变项的显示位置。

具体的效果图自己脑补,是在不行,直接拷贝以上代码,用qmlscene运行,就可看到效果了。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QML中鼠标拖动移动ListView中项的位置 的相关文章

随机推荐

  • linux文件系统

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 从操作系统的角度详解Linux文件系统层次 文件系统分类 文件系统的存储结构 不
  • List中存储实体类并根据实体类的指定属性去重

    场景 如果List中存储的是一些字符串 去重的时候就比较简单 直接使用java中的set集合去重即可 如果List中存储的是一些是实体类 去重的时候 要根据实体类的部分属性去重 可以使用下面的方法 举例如下 实体类 public class
  • 服务器迁移记录

    服务器迁移记录 安装 Docker 使用 Docker 安装 MySQL Redis 等 MySQL数据库迁移 文件迁移 安装 Docker 具体安装方法见 Docker 学习笔记 使用 Docker 安装 MySQL Redis 等 My
  • 机顶盒天线接头怎么接_数字电视接收天线怎么安装

    如今越来越多的家庭都在使用数字电视信号 因为这是一种使用起来非常方便 而且画质超级清楚的电视信号 不过很多第一次使用数字电视信号的朋友 并不是特别清楚数字电视接收天线的安装方法 所以我们今天在这里来给大家简单的介绍一下 数字电视接收天线的安
  • 贪心算法与近似算法

    1 贪心算法 1 1 教室调度问题 假设有如下课程表 你希望将尽可能多的课程安排在某间教室上 你没法让这些课都在这间教室上 因为有些课的上课时间有冲突 你希望在这间教室上尽可能多的课 如何选出尽可能多且时间不冲突的课程呢 这个问题好像很难
  • html左侧导航栏右侧显示内容

    效果图 代码 复制下来直接运行就可以
  • 计算机视觉

    手写字体的检测 1 Adaboost进行手写字体的检测 导入mnist数据集 import tensorflow examples tutorials mnist input data as input data data dir MNIS
  • QT的Frame背景图片设置自学版

    1 新建一个qt rescource file file gt new file gt qt gt name path设置 gt 包括所需主项目 gt finish 2 edit gt resource 3 add gt add prefi
  • 微信小程序如何循环控制一行显示几个wx:for

    正如上图所显示的一样 我们改如何控制一行显示几个图形呢 首先第一种方法 数量少的可以自己一行一行的写 但是当数据很多的时候呢 这时候就需要我们区使用循环进行代码的编写 废话不多数 直接写代码 demo item width 40 demo
  • JVM系列(六) JVM 对象终结方法finalize

    我们有几个特别容易混淆的关键字final finally finalize 他们之间的区别是什么 final 是java关键字 finally 是try catch finally finalize 是Object 根类的方法 今天我们着重
  • 「PAT乙级真题解析」Basic Level 1073 多选题常见计分法 (问题分析+完整步骤+伪代码描述+提交通过代码)

    乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范 从小白开始逐步掌握用编程解决问题 PAT乙级BasicLevelPractice 1073 多选题常见计分法 问题分析 题设要求按照老师批改多选题的方法来计算学生的总分
  • Map.entry详解

    Map entrySet 这个方法返回的是一个Set
  • 【软件工程基础复习整理】第一章软件工程基础前言(1)软件、工程和软件工程

    想要把软件缺陷全消灭 要用最锐利的目光去审视每一行代码 用最慎密的心思来制定每一份计划 用最严谨的态度去查看每一项工作 不掌握一定的软件工程知识 不按软件工程的有关原理进行软件开发 不积极学习新的软件开发方法和技术 就不能高效 高质量地开发
  • HCIP第六天

    OSPF的不规则区域 OSPF区域划分的要求 1 区域之间必须存在ABR 2 区域划分必须按照星型拓扑结构划分 1 远离骨干的非骨干区域 2 不连续骨干 1 通过VPN隧道将R4连接到骨干区域中 使其合法化 1 当一个路由器同时连接骨干区域
  • k8s kubectl 日常命令使用记录

    Kubectl 自动补全 设置shell自动补全 要先安装bash completion 并永久添加自动补全 source lt kubectl completion bash echo source lt kubectl completi
  • 如何安装电子水尺?

    垂直安装 吊装 根据现场实际情况 可以由不同单元规格的传感器段组合成需要的长度 然后用U形连接件连接成一支整体传感器 倾斜贴壁安装 与垂直安装方法相同 此时要将传感器测量长度转换为测量高度 故而测量精度将提高 阶梯式安装 各支传感器分别安装
  • 微信小程序从A小程序跳转至B小程序内wx.navigateToMiniProgram

    多个小程序多个主体之间相互跳转wx navigateToMiniProgram 代码在最后 参数说明 属性 类型 必填 说明 appId string 否 要打开的小程序 appId path string 否 打开的页面路径 如果为空则打
  • 深度学习之遥感变化检测数据集整理

    1 The River Data Set 高光谱河流变化检测数据 该数据集包含两幅高光谱影像 分别于2013年5月3日和12月31日采集自中国江苏省的某河流地区 所用传感器为Earth Observing 1 EO 1 Hyperion 光
  • 牛顿迭代法解非线性方程组 c语言,用牛顿迭代法解非线性方程组有两个非线性方程,未知数是x1,x2:(15x1+10x2)/[(40-30x1-10x2)^...

    共回答了24个问题采纳率 91 7 function r n mulNewton x0 eps if nargin 1 eps 1 0e 4 end r x0 myf x0 inv dmyf x0 n 1 tol 1 while tol g
  • QML中鼠标拖动移动ListView中项的位置

    在QML开发中 ListView是我们经常用到的控件 可以用它给用户展示出列表 但是往往都是将项目的显示顺序排好后 直接让ListView显示出来 亦或者是知道要移动到具体的那一位置 然后调整数据在ListView中的顺序来达到要求 现有一