Qml 模型-视图-代理(贰)之 代理(Delegate) 学习

使用模型与视图来定义用户界面时,代理在创建显示时扮演了大量的角色,在模型中的每个元素通过代理来实现可视化。 

代理

使用键盘移动 高亮 效果 

代码: 

视图绑定的属性是 ListView.isCurrentItem: 这个属性是一个布尔值,标识这个元素是否是 视图的当前元素,也就是否当前元素获取到 焦点。

每个代理的width(宽度)属性与视图的width(宽度)属性绑定,每个代理的背景颜色color 依赖绑定的属性ListView.isCurrentItem 属性。

动画添加与移除元素(Animating Added and Removed Items)

动画添加与移除效果

QML 视图为每个代理绑定了两个信号,onAdd和onRemove 。使用动画连接它们。使⽤动画连接它们,可以⽅便创建识别哪些内容被添加或删除 的动画。

动态填充一个链表模型(ListModel)

调用模型的 append 方法来添加一个新的元素,点击添加操作会 触发视图创建⼀个新的代理,并发送 GridView.onAdd信号。SequentialAnimation队列动画与这个信号连接绑定, 使⽤代理的scale属性来放⼤视图元素。

当视图中的⼀个代理点击时,将会调⽤模型的 remove ⽅法将⼀个元素从模型
中移除。
import QtQuick 2.15Rectangle{width: 200height: 300color: "white"// ListView{//     anchors.fill: parent//     anchors.margins: 20//     model: 100//     clip: true//     delegate: numberDelegateTest//     spacing: 5//     focus: true// }// Component{//     id: numberDelegateTest//     Rectangle{//         width: ListView.view.width//         height: 40//         color: ListView.isCurrentItem ? "gray" : "lightGreen"//         Text {//             anchors.centerIn: parent//             font.pixelSize: 20//             text: index//         }//     }// }ListModel{id: theListModelListElement{number:0}ListElement{number:1}ListElement{number:2}ListElement{number:3}ListElement{number:4}ListElement{number:5}ListElement{number:6}ListElement{number:7}ListElement{number:8}}Rectangle{anchors.left: parent.leftanchors.right: parent.rightanchors.bottom: parent.bottomanchors.margins: 20height: 40color: "darkGreen"Text {anchors.centerIn: parenttext: "add Item!"}MouseArea{//parent是当前对外象外的 也就是当前花括号外面的对象anchors.fill: parentonClicked: {theListModel.append({"number": ++parent.count})}}property int count: 9}GridView{anchors.fill: parentanchors.margins: 20anchors.bottomMargin: 80clip: truemodel: theListModelcellWidth: 45cellHeight: 45delegate: numberDelegateTest2}Component{id: numberDelegateTest2Rectangle{id:wrapperTestwidth: 40height: 40color: "lightGreen"Text{anchors.centerIn: parentfont.pixelSize: 10text: number}MouseArea{anchors.fill: parentonClicked: {if(!wrapperTest.GridView.delayRemove)theListModel.remove(index)}}GridView.onRemove: SequentialAnimation {PropertyAction { target: wrapperTest; property: "GridView.delayRemove"; value: true }NumberAnimation { target: wrapperTest; property: "scale"; to: 0; duration: 250; easing.type: Easing.InOutQuad }PropertyAction { target: wrapperTest; property: "GridView.delayRemove"; value: false }}GridView.onAdd: SequentialAnimation {NumberAnimation { target: wrapperTest; property: "scale"; from: 0; to: 1; duration: 250; easing.type: Easing.InOutQuad }}}}
}

形变的代理

通常使用链表时会使用当前项激活时展开的机制,这个操作可以被用于动态的 将当前项目填充到整个屏幕 来 添加一个新的用户界面, 或者为链表中的当前项提供更多的信息。
点击链表时,链表项会展开填充整个链表视图(ListView)。额外的区域用于添加更多的信息,这种机制使用一个状态来控制,当一个链表项展开时,代理项都能输入 expanded 展开状态,在这种状态下一些属性被改变。

包装器(wrapper)的高度(height)被设置为链表视图(ListView)的高度。标签图片被放大并且下移,使图片 从小图片的位置 大图片的位置移动。 两个隐藏项, 实际视图(factsView)与 关闭按键(closeButton)切换它的 透明度(opacity 属性) 显示出来。

设置链表视图(ListView)包含了设置内容Y坐标(constemtsY)这是视图顶部可见的部分代理的 Y轴坐标。 另一个变化是设置视图的交互(interactive)为false。 这个操作阻止了视图的移动,用户不能动条切换当前项。

效果图:

左侧文本标题

文本取Model 中的子项 ListElement 中属性 名称(name)

右侧图片

图片源为  ListElement 中属性 名称(imageSource)

说明文本视图

文本内容也是ListElement 中属性 facts

关闭按钮

点击事件

状态

动画

完整代码

import QtQuick 2.15Rectangle{width: 1600height: 600color: "white"// ListView{//     anchors.fill: parent//     anchors.margins: 20//     model: 100//     clip: true//     delegate: numberDelegateTest//     spacing: 5//     focus: true// }// Component{//     id: numberDelegateTest//     Rectangle{//         width: ListView.view.width//         height: 40//         color: ListView.isCurrentItem ? "gray" : "lightGray"//         Text {//             anchors.centerIn: parent//             font.pixelSize: 20//             text: index//         }//     }// }// ListModel{//     id: theListModel//     ListElement{//         number:0//     }//     ListElement{//         number:1//     }//     ListElement{//         number:2//     }//     ListElement{//         number:3//     }//     ListElement{//         number:4//     }//     ListElement{//         number:5//     }//     ListElement{//         number:6//     }//     ListElement{//         number:7//     }//     ListElement{//         number:8//     }// }// Rectangle{//     anchors.left: parent.left//     anchors.right: parent.right//     anchors.bottom: parent.bottom//     anchors.margins: 20//     height: 40//     color: "darkGreen"//     Text {//         anchors.centerIn: parent//         text: "add Item!"//     }//     MouseArea{//         //parent是当前对外象外的 也就是当前花括号外面的对象//         anchors.fill: parent//         onClicked: {//             theListModel.append({"number": ++parent.count})//         }//     }//     property int count: 9// }// GridView{//     anchors.fill: parent//     anchors.margins: 20//     anchors.bottomMargin: 80//     clip: true//     model: theListModel//     cellWidth: 45//     cellHeight: 45//     delegate: numberDelegateTest2// }// Component{//     id: numberDelegateTest2//     Rectangle{//         id:wrapperTest//         width: 40//         height: 40//         color: "lightGreen"//         Text{//             anchors.centerIn: parent//             font.pixelSize: 10//             text: number//         }//         MouseArea{//             anchors.fill: parent//             onClicked: {//                 if(!wrapperTest.GridView.delayRemove)//                     theListModel.remove(index)//             }//         }//         GridView.onRemove: SequentialAnimation {//             PropertyAction { target: wrapperTest; property: "GridView.delayRemove"; value: true }//             NumberAnimation { target: wrapperTest; property: "scale"; to: 0; duration: 250; easing.type: Easing.InOutQuad }//             PropertyAction { target: wrapperTest; property: "GridView.delayRemove"; value: false }//         }//         GridView.onAdd: SequentialAnimation {//             NumberAnimation { target: wrapperTest; property: "scale"; from: 0; to: 1; duration: 250; easing.type: Easing.InOutQuad }//         }//     }// }ListView{id: listViewTestanchors.fill: parentdelegate: detailsDelegatemodel: planets}ListModel{id: planetsListElement { name: "Mercury"; imageSource: "ufo.jpg"; facts: "Mercury is the smallest planet in the Solar System. It is the closest planet to the sun. It makes one trip around the Sun once every 87.969 days." }ListElement { name: "Venus"; imageSource: "SiC.jpeg"; facts: "Venus is the second planet from the Sun. It is a terrestrial planet because it has a solid, rocky surface. The other terrestrial planets are Mercury, Earth and Mars. Astronomers have known Venus for thousands of years." }ListElement { name: "Earth"; imageSource: "football1.jpeg"; facts: "The Earth is the third planet from the Sun. It is one of the four terrestrial planets in our Solar System. This means most of its mass is solid. The other three are Mercury, Venus and Mars. The Earth is also called the Blue Planet, 'Planet Earth', and 'Terra'." }ListElement { name: "Mars"; imageSource: "football.jpg"; facts: "Mars is the fourth planet from the Sun in the Solar System. Mars is dry, rocky and cold. It is home to the largest volcano in the Solar System. Mars is named after the mythological Roman god of war because it is a red planet, which signifies the colour of blood." }}Component{id: detailsDelegateItem {id: wrapperwidth: listViewTest.widthheight: 30Rectangle{anchors.left: parent.leftanchors.right: parent.rightanchors.top: parent.topheight: 30color: "#ffaa00"Text {anchors.left: parent.leftanchors.verticalCenter: parent.verticalCenterfont.pixelSize: parent.height-4text: name}}Rectangle{id: imageTestcolor: "black"anchors.right: parent.rightanchors.top: parent.topanchors.rightMargin: 2anchors.topMargin: 2width: 26height: 26Image {anchors.fill: parentfillMode: Image.PreserveAspectFitsource: imageSource}}MouseArea{anchors.fill: parentonClicked: {parent.state = "expanded"console.log(name + "被点击")}}Item {id: factsViewanchors.top: imageTest.bottomanchors.left: parent.leftanchors.right: parent.rightanchors.bottom: parent.bottomopacity: 0Rectangle{anchors.fill: parentcolor: "#cccccc"Text {anchors.fill: parentanchors.margins: 5clip: truewrapMode: Text.WordWrapfont.pixelSize: 12text: facts}}}Rectangle{id: closeButtonanchors.right: parent.rightanchors.top: parent.topanchors.rightMargin: 2anchors.topMargin: 2width: 26height: 26color: "red"opacity: 0MouseArea {anchors.fill: parentonClicked: wrapper.state = ""}Text{anchors.fill: parentanchors.horizontalCenter: parent.horizontalCenteranchors.verticalCenter: parent.verticalCenterfont.pixelSize: 26text: "X"}}states:[State {name: "expanded"PropertyChanges { target: wrapper; height: listViewTest.height }PropertyChanges { target: imageTest; width: listViewTest.width; height: listViewTest.height -200; anchors.rightMargin: 0; anchors.topMargin: 30 }PropertyChanges { target: factsView; opacity: 1 }PropertyChanges { target: closeButton; opacity: 1 }PropertyChanges { target: wrapper.ListView.view; contentY: wrapper.y; interactive: false }}]transitions: [Transition {NumberAnimation {duration: 200;properties: "height,width,anchors.rightMargin,anchors.topMargin,opacity,contentY"}}]}}}

遇到的问题

  • 点击没反应 expanded 状态拼写错误 导致状态切换不了
  • 图片设置高度不对 导致文本不显示

  • 包装状态切换被注释导致 显示有问题  导致切换条目显示不到图片下面 

 

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

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

相关文章

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 (简单) 2.移除元素 (简单) 3.删除有序数组中的重复项 (简单) 4.删除有序数组中的重复项 II(中等) 5.多数元素(简单&am…

内外网交换过程中可能遇到的安全风险有哪些?

在数字化时代,企业内外网之间的数据交换变得日益频繁。然而,这一过程中的安全风险和效率问题也日益凸显。我们将探讨内外网交换可能遇到的安全风险,并介绍镭速内外网交换系统如何有效应对这些挑战。 内外网交换过程中的五大安全风险 数据泄露…

人工智能之机器学习概念3【培训机构学习笔记】

定义及作用: 无监督学习是通过试图学习或提取数据背后的数据特征,或者从数据中抽取出重要的特征信息,常见的算法有类聚、降维、文本处理(特征抽取)等。无监督学习一般是作为有监督学习的前期数据处理,功能…

文件系统的存储方式

磁盘是一个机械设备,外设。 磁盘的基本单位是扇区,一个扇区512字节,4KB。一片可以有n磁道,1磁道可以有m扇区。 如何找到指定位置的扇区?a.找到指定的磁头H b.找到指定的磁道(柱面)C c.找到指定的扇区S。这个叫CHS定址法…

微搭低代码私有化版本升级

目录 1 登录服务器2 进入weda的安装目录3 停止服务4 清除老版本镜像5 下载最新部署包6 重新激活license7 安装服务总结 我们上一篇讲解了部署私有化版本,随着公测的进行,版本是在不断的升级,目前已经到了0.3版本,我们有必要升级一…

JavaSec | JDBC反序列化原理和调用链细节分析

基础知识 JDBC简介 JDBC(Java Database Connectivity,Java 数据库连接)是 Java 语言中用来规范客户端如何访问数据库的应用程序接口,提供了诸如查询和更新数据在内的方法。JDBC 提供了一种基准,据此可以构建更高级的…

【氮化镓】用于低压射频电源的具有80.4% PAE的Si基E-Mode AlN/GaN HEMT

引言 本文是一篇关于增强型(E-mode)AlN/GaN高电子迁移率晶体管(HEMTs)的研究论文,晶体管是在硅衬底上制造的,并在3.6 GHz频率下展示了80.4%的峰值功率附加效率(PAE)。文章首先介绍了GaN器件在微波和毫米波功率放大器中的应用,特别是在雷达、卫星通信和民用移动通信系…

刚刚!EI目录更新,213本期刊停止收录

刚刚,EI Compendex数据库发布了最新版收录期刊目录。 目录实际更新时间为2024年11月1日 2024年截止11月份EI数据库已更新3次,更新时间分别为2024年1月、2024年8月和2024年11月。 本次目录共收录期刊5643本,其中包含Journal类型4359本、Pr…

L0G2000 Python 基础知识

力扣用python3解题383. 赎金信 https://leetcode.cn/problems/ransom-note/description/ 题目: 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否…

STM32设计防丢防摔智能行李箱-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…

同步互斥相关习题2 8道 含详解

14 一组进程的执行顺序如下图所示,圆圈P1,P2,P3,P4,P5,P6表示进程,弧上的字母a,b,c, d,e,f,g,h表示同步信号量,请用P,V操作实现进程的同步。 semaphore a …

CDH大数据平台搭建

各大开源以及商用厂商的大数据产品汇总: https://zhuanlan.zhihu.com/p/675011462 Ambari 界面: 一、安装一个新的虚拟机 配置要求:8核,10G内存,最好是200G 修改yum源: 修改阿里云的镜像文件&#xff1…

500左右的骨传导耳机哪个牌子好?用户体验良好的五大骨传导耳机

作为一名拥有十几年从业经验的科技爱好者,我主要想告诉大家一些关于骨传导耳机的知识。其中,要远离所谓的不专业产品,它们的佩戴不适和音质不佳问题高得吓人,尤其是很多宣称能提供舒适佩戴和高音质的产品,超过九成的用…

【YOLOv11改进[注意力]】引入DA、FCA、SA、SC、SE + 含全部代码和详细修改方式

本文将进行在YOLOv11中引入DA、FCA、SA、SC、SE魔改v11,文中含全部代码、详细修改方式。助您轻松理解改进的方法。 一 DA、FCA、SA、SC、SE ① DA 论文:Dual Attention Network for Scene Segm

捉虫笔记(六)-谁把系统卡住了?

06-谁把系统卡住了? 1、现象 QA反馈,在软件退出的时候,会把整个系统卡住,将近40s。我第一反应这么离谱,我们的软件有这么大的“魅力”,将老大哥抖三抖。 我立马重现现场,果然如此。虽然没有Q…

网络安全之信息收集-实战-2

请注意,本文仅供合法和授权的渗透测试使用,任何未经授权的活动都是违法的。 目录 7、网络空间引擎搜索 8、github源码泄露 9、端口信息 10、框架指纹识别 11、WAF识别 12、后台查找 7、网络空间引擎搜索 FOFA:https://fofa.info/ 360 …

51c自动驾驶~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱,行动更加稳健 目前四足机器人的全球市场上,市场份额最大的是哪个国家的企业?A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 &#x1f…

Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找

一,数组翻转 1.概述:数组对称索引位置上的元素互换,最大值数组序号是数组长度减一 创建跳板temp,进行min和max的互换,然后min自增,max自减,当min>max的时候停止互换,代表到中间值 用代码实…

jquery 链模式调用简易实现

<script>// 定义一个名为A的构造函数&#xff0c;接受selector和context参数var A function (selector, context) {// 返回一个新的A.fn.init实例return new A.fn.init(selector, context);}// 设置A的原型和fn属性A.fn A.prototype { // 强化构造器:// 当显式地重写 …

无人机侦察打击方案(1)

​​​​​ 概述 任务来源于无人机侦察研制任务&#xff0c;涵盖无人机目标昼夜识别与跟踪、目标定位等功能任务。 组成及功能 无人机侦察系统设备构成如下图所示&#xff0c;分为光电云台、激光打击设备与操控端构成。 图 1 设备组成与链路 光电云台完成无人机目标自主识别…