Qt Quick系列(8)—Model-View—视图信号

news2024/12/23 9:07:18

🚀作者:CAccept
🎂专栏:Qt Quick
在这里插入图片描述

文章目录

  • 前言
  • 代码示例
    • 源码
    • 关键知识点
  • 总结

前言

在Qt Quick的Model-View中内置视图有很多,有Repeater、ListView、GridView…,而他们也有着自己的信号,比如Repeater有:itemAdded(int index, Item item)itemRemoved(int index, Item item),ListView有:add()pooled()remove()以及reused(),GridView有:add()remove()
以下分别是ListView和GridView在帮助文档中对Signal的列举👇
在这里插入图片描述

在这里插入图片描述
可以看到add()和remove()信号在各个视图中都很重要,add()信号是在model新添加一个元素时,他所绑定的View就会触发该信号,相反删除一个元素时就会触发remove()信号,接下来我们对这两个信号进行一些举例和说明吧~~


代码示例

需要实现的代码效果:
1、使用矩形框将model中的元素表示出来
2、当点击add按钮时,实现model元素的添加
3、当点击元素矩形框时,对该元素进行删除
4、在添加和删除过程中要有渐变效果


源码

请先看代码,代码中也有很多注释,代码也不复杂相信认真看的话都能够看得懂,后续还有对关键知识点的讲解
main.qml

import QtQuick

Rectangle {
    width: 480
    height: 300
    //背景
    gradient: Gradient {
        GradientStop { position: 0.0; color: "#dbddde" }
        GradientStop { position: 1.0; color: "#5fc9f8" }
    }

    //add添加按钮
    Rectangle{
        property int count:count=theModel.count-1
        //确定位置
        anchors.bottom: parent.bottom
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.margins: 20

        height: 40
        color:'#53f769'
        border.color: Qt.lighter(color,1.1)

        Text{
            anchors.centerIn: parent
            text:"Add Item"
        }
        MouseArea{
            anchors.fill: parent
            //点击添加按钮时,model就会添加元素
            onClicked: {
                theModel.append({num:++parent.count})
            }
        }
    }

    //View
    GridView{
        anchors.fill: parent
        anchors.margins: 20
        anchors.bottomMargin: 80

        clip: true
        cellHeight: 45;cellWidth: 45
        //指定model以及delegate
        model:theModel
        delegate: numberDelegate
    }

    //Model
    ListModel{
        id:theModel
        ListElement{num:0}
        ListElement{num:1}
        ListElement{num:2}
        ListElement{num:3}
    }

    //Delegate
    Component{
        id:numberDelegate

        Rectangle{
            id:wrapper

            gradient: Gradient {
                GradientStop { position: 0.0; color: "#f8306a" }
                GradientStop { position: 1.0; color: "#fb5b40" }
            }

            required property int index
            required property int num
            width: 40;height: 40

            Text{
                anchors.centerIn: parent
                font.pixelSize: 12
                text:wrapper.num
            }

            GridView.onAdd:addAnimation.start()
            GridView.onRemove:removeAnimation.start()

            //让框框慢慢变出来从0-》1
            NumberAnimation{
                id:addAnimation
                //目标就是代表当前元素的delegate
                target: wrapper
                property: "scale"
                from:0;to:1
                //耗时
                duration:250
                easing.type: Easing.InOutQuad
            }

            //顺序执行
            SequentialAnimation{
                id:removeAnimation
                //要使用延时删除,否则后面的效果其实都不会有效果
                PropertyAction {
                    target: wrapper; property: "GridView.delayRemove" ;value:true
                }
                NumberAnimation{
                    target: wrapper
                    property: "scale"
                    to:0
                    duration:250
                    easing.type: Easing.InOutQuad
                }
                //将延时删除的效果取消
                PropertyAction {
                    target: wrapper; property: "GridView.delayRemove" ;value:false
                }
            }

            MouseArea{
                anchors.fill: parent
                onClicked: {
                    //当点击元素的框框时触发remove信号,删除元素
                    theModel.remove(index)
                }
            }
        }
    }
}

运行效果:
在这里插入图片描述

关键知识点

1、在进行删除效果的设置时,一定先要将元素的删除进行delay延时,否则在实现效果前,元素已经被删除了,做任何的效果都会是无效的,在做完效果以后要将延时删除给解除

//要使用延时删除,否则后面的效果其实都不会有效果
PropertyAction {
	//wrapper为当前元素的delegate
    target: wrapper; property: "GridView.delayRemove" ;value:true
}
......................
......删除效果设置.....
......................
//将延时删除的效果取消
PropertyAction {
	//wrapper为当前元素的delegate
    target: wrapper; property: "GridView.delayRemove" ;value:false
}

2、ListModel的添加删除元素操作分别是:

  • ListModel.append({num:++parent.count})//{}中的结构就是ListModel的数据元素结构
  • ListModel.remove(index)//index为要删除元素的index

3、对于视图信号的处理一般是放在delegate中实现,因为这样很好的获得元素的index以及各种信息。


总结

本篇文章到此结束,很感谢您能够看到这里,希望本篇文章能够对您有所帮助,如果对本篇文章有任何疑问或者是发现问题,也请在评论区中提出来,谢谢啦!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebDAV之派盘本地个人云+Documents

Documents是一款由Readdle开发的文档管理和编辑工具,支持PDF阅读、音频播放、图像浏览和标注、以及多种常见文档格式的编辑操作等。派盘是一款本地私有云产品,基于WebDAV、FTP、SMB等多种协议,提供文件存储、分享、同步、备份等服务&#xff…

【Squid一】Squid代理服务器应用

Squid代理服务器应用 1.Squid代理服务器1.1 正向代理的工作机制1.2 代理服务器的概念及其作用1.3 代理服务器主要作用1.4 Squid代理的类型 2.CDN2.1 CDN概述2.2 CDN优势2.3 CDN对网络的优化作用2.4 CDN访问过程2.5 CDN网络的组成要素 3.安装Squid服务3.1 使用脚本启动和关闭squ…

guest内核不响应导致磁盘卸载问题排查

用户问题 客户报障磁盘卸载不了,而且是经常出现卸载不了的情况,客户比较着急,同时PDD也是大客户。 排查过程 查看宿主机上虚拟机信息 1、用户虚拟机有14块磁盘,而且这14块都是以legacypci的方式插入虚拟机,我印象中…

MATLAB | 拉普拉斯分布/拉普拉斯噪声的生成

一、实验目标 生成拉普拉斯分布的噪声,并分析它的概率密度函数 二、解决思路 (1)拉普拉斯分布可以由指数分布生成 拉普拉斯的概率密度函数为 f ( x ; μ , λ ) 1 2 λ e − ∣ x − μ ∣ λ f(x;\mu,\lambda)\frac{1}{2 \lambda} e^{…

创建启动前端vue与后端python/flask,前后端分离,相互传递参数

创建启动vue 确保你已经安装了Node.js和npm 安装vue npm install -g vue/cli创建vue项目: vue create my-project cd my-project启动vue npm run serve如果安装vue报错:管理员权限模式打开powershell Windows PowerShell 版权所有(C&#…

windows怎么查看目标文件.o and windows - 如何使用/安装 GNU binutils (objdump)

GNU binutils-objdump工具 一、windows怎么查看目标文件.o二、安装GNU binutils (objdump)三、使用GNU binutils (objdump)参考资料 一、windows怎么查看目标文件.o 可以使用GNU binutils (objdump)进行查看编译生成的目标文件.o。 二、安装GNU binutils (objdump) 点击下载…

Apache Airflow 多个 Provider 存在漏洞

项目介绍 Airflow 是一个使用 python 语言编写的 data pipeline 调度和监控工作流的平台。 Airflow 是通过 DAG(Directed acyclic graph 有向无环图)来管理任务流程的任务调度工具, 不需要知道业务数据的具体内容,设置任务的依赖…

辅助驾驶功能开发-功能规范篇(21)-4-XP行泊一体方案功能规范

XPilot Parking 自动泊车系统 • 超级自动泊车辅助(Super AutoParking Assist)、语音控制泊车辅助(Autoparking with Speech) - 产品定义 超级自动泊车辅助是⼀个增强的自动泊车辅助系统。在超级自动泊车辅助系统中,识别车位将会变得实时可见, 并且不可泊入的⻋位也将…

zynq系列器件使用vivado配置国产内存

zynq系列器件使用vivado配置国产内存 一、镁光公司器件命名的含义二、紫光公司器件命名的含义二、国产ddr(SCB13H8G162BF-13KI)和镁光(MT41K512M8-125)ddr参数对比三、vivado参数填入 一、镁光公司器件命名的含义 以MT41K512M8-1…

代码随想录算法训练营第六天 | 哈希表系列2(两数之和--四数相加II--三数之和--四数之和)

哈希表系列2 1 两数之和本题思路代码随想录的代码力扣的示例代码 454 四数相加II本题思路代码随想录的代码力扣的示例代码 15 三数之和本题思路代码随想录的代码力扣的示例代码 18 四数之和代码随想录的代码力扣的示例代码 1 两数之和 给定一个整数数组 nums 和一个整数目标值…

DAY41——动态规划part3

整数拆分 dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。 dp[i](i-j)*j或j * dp[i-j]两种可能,前者是拆成两个数的可能性,后者是拆成三个或更多的可能性 对于dp[i] j * dp[i-j] 对每个i遍历j(1->i-1) 事实上是把i拆成j和i-j两…

web安全php基础_搭建php环境

首先打开phpstudy的网站栏点击创建网站,新建一个网站(域名随便输反正是局域网)然后点击确认 如下,网站便创建好了 打开浏览器输入刚刚创建网站时输入的域名,即可看见我们的网站 然后网站好了,就可以新建项…

IDEA中MyBatiX插件的使用教程

MybatisX插件功能介绍 主要功能如下: 生成mapper xml文件 快速从代码跳转到mapper及从mapper返回代码 mybatis自动补全及语法错误提示 集成mybatis generator gui界面 根据数据库注解,生成swagger model注解 首先下载MybatisX插件 配置数据源 在idea中连…

【C语言】指针和数组笔试题解析

简单不先于复杂,而是在复杂之后。 注:题目会附在前面,大家可以先复制代码自己做一遍,再看答案。 目录 1. 一维数组 2. 字符数组 2.1 sizeof 相关 2.1.1 题一 2.1.2 题二 2.1.3 题三 2.2 strlen 相关 2.2.1 题一 2.2.…

面试之线程池(高级开发 必问)

今天被面试 问麻了。第一个问题是: 一个类有私有的变量,如果修改这个类的私有变量。使用setter方法除外。(后来才知道用反射) 算了,我还是太水了。回归主题。 线程池的优点: (1):降低资源消耗,通过重读…

UE4/5动画蓝图中Additive Animations讲解

Additive Animation指用当前动画作为Additive动画减去参考位置后得到的Delta量,再通过Apply Additive节点将任意动画输出套用该Delta量,从而达到动画叠加的效果。 官方案例的Additive Animation案例,位于“内容示例/Animation_Basics”场景中…

【Visual Studio】printf() 函数无输出显示问题。使用 C++ 语言,配合 Qt 开发串口通信界面

使用 C 语言,配合 Qt 开发串口通信界面时,遇到 printf() 函数无输出显示。 在工程属性的对应位置添加 editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$(ProjectName).exe 即可,如下图所示。 成功运行的截图如下: Ref. Visual Studio 20…

用uniapp完成一个前端项目

持续更新中… 这里给初学者提供一个uniapp的练习项目,学习uniapp需要vue和微信小程序的基础(其实微信小程序基础需要的不多),建议把基础内容学牢固了再看本文。 本项目完成的是H5小程序APP的新闻项目,下面就开始说一下…

kubectl详解之声明式管理方法

目录 一、声明式管理方法二、资源配置清单的管理2.1 查看资源配置清单2.1 修改资源配置清单并应用2.1.1 离线修改2.1.2 在线修改 一、声明式管理方法 适合于对资源的修改操作 声明式资源管理方法依赖于资源配置清单文件对资源进行管理 资源配置清单文件有两种格式:…

Codeforces 879 C.Game with Reversing

博弈,思维,分类讨论 题意: 给你两个字符串,Alice可以每次选一个字符串的任意字母换成任意的字母,Bob可以选择一个字符串进行反转,Alice希望快速结束游戏,Bob希望拖延游戏,问你如果…