Qt Quick系列(7)—Model-View

news2024/11/15 5:07:01

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

文章目录

  • 前言
  • 内置视图View
    • Repeater
    • ListView
    • GridView
  • 代理delegate
  • 总结

前言

在QML中,model和view由delegate连接,他们的关系如下👇
1、delegate 属性:delegate知道model的内容以及如何可视化它-怎么显示
2、view知道delegate的概念以及如何布置它们-怎么摆放
3、model属性:model只知道它所表示的数据-要显示的内容集合
4、onItem 属性:当创建每个重复项时,可以访问该项的属性和方法。使用 onItem 属性,您可以处理每个重复项的信号、属性或方法。

本博客中工程使用的环境为:qt6 + Qt Creator10.0.1

内置视图View

Qt Quick提供了一组内置视图有:Repeat、ListView、GridView、TableView
在这里插入图片描述


Repeater

Repeater 元素提供了一种简单的方式来重复创建并显示其他元素的多个实例。您可以指定重复的次数或基于数据模型进行重复。
看代码示例吧👇
BlueBox.qml

import QtQuick

Rectangle {
    color:"blue"
    property alias text: label.text
    Text {
        id: label
        color:'white'
        anchors.centerIn: parent
        text: qsTr("text")
    }
}

main.qml

import QtQuick
Column{
    height: 160
    spacing:2
    Repeater{
        model: ListModel {
            ListElement { name: "Mercury"; surfaceColor: "gray" }
            ListElement { name: "Venus"; surfaceColor: "yellow" }
            ListElement { name: "Earth"; surfaceColor: "green" }
            ListElement { name: "Mars"; surfaceColor: "orange" }
            ListElement { name: "Jupiter"; surfaceColor: "orange" }
            ListElement { name: "Saturn"; surfaceColor: "yellow" }
            ListElement { name: "Uranus"; surfaceColor: "lightBlue" }
            ListElement { name: "Neptune"; surfaceColor: "darkBlue" }
        }
        //这样model中的每个元素都会用一个BlueBox进行表示
        delegate: BlueBox{
            required property string name
            required property color surfaceColor

            width:160;height:30
            text:name
            radius: 3

            Rectangle{
                anchors.left: parent.left
                anchors.verticalCenter: parent.verticalCenter
                anchors.leftMargin: 4
                width: 16;height:16;radius: 8
                color:parent.surfaceColor
            }
        }
    }
}

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


ListView

ListView 是 Qt Quick 中的一个内置视图组件,用于显示垂直或水平滚动的项目列表。它提供了一种方便的方式来展示和交互大量的项目,比较重要的属性有clip、orientation、highlight、header、footer、cacheBuffer。
GreenBox.qml

import QtQuick 2.0
Rectangle {
    color:"lightgreen"
    property alias text: label.text
    Text
    {
        id:label
        color:"white"
        anchors.centerIn: parent
    }
}

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 80
    height: 300
    ListView
    {
        id:lv
        anchors.fill:parent
        anchors.margins: 20
        //会让创建更加的柔顺,加载的时候就不会很突兀
        clip:true

        model:10
        spacing:5
        //缓存大小追加80像素(相对于高度来说)
        cacheBuffer:80

        //横向ListView
        //orientation:ListView.Horizontal
        highlight:hightComponent
        header:headerComponent
        footer:footerComponent
        focus:true
        delegate: Item
        {
            id:wrapper
            //required property int index
            width:lv.width
            height:40
            //每个代理在model上面的索引
            Text
            {
                anchors.centerIn: parent
                text:index
            }
            scale:(lv.currentIndex==index)?2:1
            Component.onCompleted:{console.log(index+" added!")}
            Component.onDestruction:{console.log(index+" deleted!")}
            //当点击当前这个项的时候,那么焦点就会变成当前的index
            MouseArea {
                anchors.fill: parent
                onClicked: {
                    lv.currentIndex = index
                }
            }
        }

    }

    Component
    {
        id:hightComponent
        GreenBox
        {
            id:gb
            width:lv.width
            y:lv.currentItem.y
            //当y发生改变时
            Behavior on y
            {
           		//颜色慢慢消失再慢慢出现
                SequentialAnimation
                {
                    PropertyAnimation
                    {
                        target: gb
                        property: "opacity"
                        to:0
                        duration: 200
                    }

                    NumberAnimation{duration:200}
                    PropertyAnimation
                    {
                        target: gb
                        property: "opacity"
                        to:1
                        duration: 200
                    }
                }
            }
        }
    }

    Component
    {
        id:headerComponent
        BlueBox
        {
            width: lv.width
            height: 30
            text:"Header"
        }

    }
    Component
    {
        id:footerComponent
        BlueBox
        {
            width: lv.width
            height: 30
            text:"footer"
        }

    }
}

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


GridView

GridView 是 Qt Quick 中的一个内置视图组件,用于以网格形式展示项目列表。它适用于需要将项目以行和列的形式排列的情况。

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    GridView
    {
        id:gv
        anchors.fill:parent
        anchors.margins: 20
        clip:true
        model:100
        //每个单元格的宽度和高度
        cellWidth:45
        cellHeight:45
        flow:GridView.TopToBottom
        //delegate中的width和height优先级更高,如果cellWidth和cellHeight也设置的话,以delegate为优先
        delegate: GreenBox
        {
            width:40
            height:40
            text:index
        }
    }
}

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



代理delegate

每个代理都可以访问许多附加的属性,其中一些来自数据模型,另一些来自视图。

  • 从模型中:属性将每个项目的数据传递给delegate。
  • 从视图中:属性将状态信息传递与给delegate。

从视图附加的最常用属性是ListView.isCurrentItem和ListView.view。第一个是布尔值,指示项是否为当前项,而后面的是对实际视图的只读引用。
看一个代码示例吧👇
main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Rectangle {
    width: 120;height: 300

    gradient: Gradient {
        GradientStop { position: 0.0; color: "#f6f6f6" }
        GradientStop { position: 1.0; color: "#d7d7d7" }
     }

    ListView {
        id:lv
        anchors.fill: parent
        anchors.margins: 20
        focus: true
        model: 100
        //可以在外部定义进行使用
        delegate: numberDelegate
        spacing: 5
        //柔顺地进行消失和生成
        clip: true
    }

    Component {
        id: numberDelegate
        Rectangle {
            id: wrapper
            //拿到引用了这个delegate的ListView,用来更新数值
            width: ListView.view.width;height: 40
            color: ListView.isCurrentItem ? "#157efb" : "#53d769"
            //后面参数越大,颜色越浅
            border.color: Qt.lighter(color, 1.1)

            Text {
                anchors.centerIn: parent
                font.pixelSize: 10
                text: index
            }
            //点击信号更新currentIndex
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    lv.currentIndex=index
                }
            }

        }
    }
}

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


总结

本篇博客对Model-View的整个关系进行了简单的梳理,并且提供了一些可供参考的代码示例,后期还会对此内容进行相应的补充,对本博客进行持续的更新,后面会对视图的一些信号进行讲解,希望本篇文章对您有所帮助,谢谢!!
在这里插入图片描述

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

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

相关文章

Vue3+Vite配置环境变量模式切换开发与生产环境的接口域名

.env.development # .env.production VITE_APP_TITLEhttp://172.16.1.115:8096 .env.production # .env.production VITE_APP_TITLEhttps://172.16.1.119:8097在接口文件中使用配置的地址 import Axios from axios const instanceAxios.create({baseURL:import.meta.env.VITE_A…

如何建立一个企业网站

建立一个企业网站的方法 1、好。如果你的网站将专注于你已经有了一个不错的主意,请跳过此步骤。如果不是,这里有一些事情来帮助你找出答案。首先,要明白,有几十亿人在互联网上,一个健康的比例有自己的网站。如果你限制…

实验八 文件系统-实验部分

目录 一、知识点 1. ucore文件系统设计目标--设计理念和含义 ​​​​1.1. 通用文件系统访问接口层: 1.2. 文件系统抽象层: 1.3. Simple FS 文件系统实现层: 1.4. 外设接口层: 2. ucore文件系统架构总体设计 2.1. ucore文件…

wifi 7主要性能提升

提升1:更快。接近4倍的速率提升,高达36Gbps 提升2:低延迟。单用户低延迟提升80%,多用户低延迟提升25%。 wifi7的主要改变: 改变1:6GHz 320MHz 改变2:4096 QAM 改变3:MLO & M…

有关STL关联/非关联容器/优先级队列的按序初始化

1.对于map/unorderedmap这种,比如想要按照second去排序,思路一,转换成vector这种线性容器,然后利用sort函数,自定义第三个参数去做想要的排序 总之就得转换成别的去做,不能在初始化的时候用自定义的函数或…

JLINK驱动、接线、接口模式、硬件都没问题,JLINK仍然读不到芯片的解决办法

今天遇到一个奇葩的问题,JINK驱动、接线、模式设置,硬件啥都没有问题,就是JINK连不到芯片,读不到芯片。自己平时都是用SWD模式,然后直接JLINK的GND 、SWDIO、SWCLK直接接上,一般我不会接VCC,应该…

Leetcode 75算法题( 下)(使用C++实现)

目录 回溯 17. 电话号码的字母组合 216. 组合总和 III 动态规划 - 一维 1137. 第 N 个泰波那契数 746. 使用最小花费爬楼梯 198. 打家劫舍 790. 多米诺和托米诺平铺 动态规划 - 多维 62. 不同路径 1143. 最长公共子序列 714. 买卖股票的最佳时机含手续费 72. 编辑距…

提升前端GIS开发技能:深入了解5个热门地图框架

前言 地理信息系统(GIS)已经成为现代应用开发中不可或缺的一部分,尤其在前端开发中。随着Web技术的快速发展,许多强大而灵活的GIS框架涌现出来,为开发人员提供了丰富的工具和功能,使他们能够创建交互式、高…

强大易用的开源建站工具Halo

最近无意间看到别人的博客外观非常美观,便萌生了偷师学艺的想法…所以就看到看了Halo这个开源的建站项目,其实使用起来非常简单,但是想要做一个类似的开源建站工具,谈何容易 访问官网 https://halo.run/ 使用docker部署 搜索镜像halo do…

OpenAI接口代理设置

国内使用OpenAI接口,需要设置代理,代理的设置有两种方法,局部的方法和全局的方法,推荐局部设置的方法,它不会影响你使用gradio/flask等框架,如果使用全局设置,会影响gradio/flask等的使用。 局部…

Tree树形控件做权限时,保持选项联动的同时,解决数据无法回显的问题

项目需求: 要求树形控件要有父子联动,也就是选择父级选项,子级也要选中,那么check-strictly属性就不能设置死,我的是 :check-strictlycheckStrictly,在data中赋值有变量。我之前设置check-strictly,就没了联动效果&…

HR必读的四本书籍推荐

作为一名人力资源管理者,除了在实际工作中积累经验,还需要不断地学习和进修,以应对日益变化的企业管理挑战。但是,在人力资源管理这个领域,有太多的书籍、课程和文章可供选择,这让人不免有些困惑。因此&…

《横向领导力》

在介绍《横向领导力》之前,有必要先推荐另一本同类书籍——《经理人参阅:领导力提升》。这本书来自经理人参阅ManagerReads,涵盖了领导力的许多概念和技能,对于想要全面提升领导力的人员来说是非常有价值的。不过,对于…

9.pixi.js编写的塔防游戏(类似保卫萝卜)-群炮弹发射逻辑

游戏说明 一个用pixi.js编写的h5塔防游戏,可以用electron打包为exe,支持移动端,也可以用webview控件打包为app在移动端使用 环境说明 cnpm6.2.0 npm6.14.13 node12.22.7 npminstall3.28.0 yarn1.22.10 npm config list electron_mirr…

MATLAB 投资问题

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

【子序列+状压DP】ABC308 E MEX

这应该算是很套路的题,照理说是要做出来的 E - MEX (atcoder.jp) 题意: 思路: 首先,三元组很容易让我们联想到枚举中间那个元素,但是在这道题中不是这么搞的 可以注意到,题目是要我们统计所有子序列&qu…

WinSCP脚本实现将jar包一键上传Ubuntu并docker部署

准备 首先,在Ubuntu写一个.sh脚本用于自动更新jar包的docker容器和镜像,然后在Windows写一个.bat脚本用于上传jar包并运行.sh脚本。 deploy.sh # Kill容器 docker kill demo# 删除容器 docker rm demo# 删除镜像 docker rmi my/demo# 构建镜像 docker b…

Spring事务@Transactional常见的8种失效场景(通俗易懂)

前言:在日常的开发过程中,多多少少会遇到Spring事务失效导致的一些事故,本篇主要通过具体的案例分析来讲解常见的8种失效的场景,让阅读者通俗易懂的明白每一种事务失效的原因,知其然并知其所以然! 目录 一…

Java——《面试题——Git篇》

全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——…

初识操作系统以及Linux常用指令(上)

目录 一:操作系统简介 二:Linux简介 Linux是什么 Linux的作用 非图形化的Linux界面 Linux环境的搭建 三:Linux下的文件结构 ⭐Linux组织文件的结构为多叉树 文件路径 Linux下的隐藏文件 四:Linux基础指令 创建用户相…