QML 模型和视图

news2024/11/25 11:03:58

模型/视图架构简介

使用 QML 时,有些情况下需要使用模型视图结构显示一些列表等控件,比较好的方式是用 Python 接管数据模型部分,方便处理数据;QML 和 JavaScript 负责前端部分,实现前端和后端的分离。

MVD 简介

Model-View-Controller (MVC) 是源自 SmallTalk 的一个设计模式,在构建用户界面时经常用到。把功能相近的部分归结在一起,不相近的部分进行隔离。MVC 将系统分解为模型、视图、控制器三部分,每一部分相对独立,职责单一,在实现过程中可以专注于 MVC 各自的核心逻辑。MVC 的最基本的作用就是解耦。

模型(Model)代表数据。视图(View)代表界面的布局。控制器(Controller )界面的具体显示样式,和用户进行具体的交互。

QML 对 Controller 部分做了改动,引入了 Delegate,合起来就是 Model-View-Delegate。模型还是负责提供数据,视图则负责基本的布局管理,剩下显示样式由 Delegate 实现。

Model-View-Delegate的框架如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x7tdbq2s-1686869923639)(assets/image-20230601095124-c9x1cqx.png)]

类比到 web 前端,View 提供了布局(html),Delegate 提供了样式(css),model 则提供数据(data),在mvc中, 不仅数据与显示要分离, 在显示中, 布局与样式也要分离, 布局指的是大的框架背景, 元素的排列组合方式和定位模式, 而样式指的是子元素的颜色, 字体, 滤镜等效果。

模型/视图架构中模型(model)、视图(View)和委托(Delegate)之间的关系:

  • 模型(model):包含数据及其结构,有多种 QML 类型可以创建模型
  • 视图(view):显示数据的容器,数据可以通过列表或者表格形式显示出来
  • 委托(delegate):控制数据应该如何在视图中进行显示。委托获取并封装了模型中的每个数据,需要通过委托才能访问到数据

使用样例

为了将数据显示出来,需要将视图的 model 属性绑定到一个模型类型,然后将 delegate 属性绑定到一个组件或者其他兼容的类型

import QtQuick

Item {
    width: 200; height: 50、
    // 数据模型,将要渲染的数据
    ListModel {
        id: myModel
        ListElement { type: "Dog"; age: 8 }
        ListElement { type: "Cat"; age: 5 }
    }
    // 数据项显示模板,理解为渲染模板
    Component {
        id: myDelegate
        Text { text: type + ", " + age; font.pointSize: 12 }
    }
    // 数据映射
    ListView {
        anchors.fill: parent
        model: myModel; 
        delegate: myDelegate
    }
}

这里首先创建了一个 ListModel 作为数据模型,然后使用一个 Component 组件作为委托,最后使用 ListView 作为视图,在视图中需要指定模型和委托,如下图的关系:

在这里插入图片描述

数据模型

QtQuick 提供的模型主要包括 QtQml.ModelsQtQml.XmlListModelsTableModel这几个模块中,它们是 Qt 框架中用于处理数据模型和视图的模块和类。

这些类都是用于在 QML 中处理数据模型的工具,可以与各种 QML 视图类型(如 ListView、GridView、TableView 等)配合使用。通过这些类,开发者可以方便地创建、操作和展示数据,使用户界面与底层数据模型保持同步。无论是静态数据还是动态数据,这些类都为开发者提供了灵活的方式来构建功能强大的交互式应用程序。下面是对它们的简要介绍:

ListModel

ListModel 是一个简单的容器,可以包含 ListElement 类型来存储数据。

QtQml.Models 是 Qt QML 模块中的一部分,提供了一组用于创建和管理数据模型的类。其中最常用的类是 ListModel,它提供了一种简单的方式来创建基于列表的数据模型。ListModel ​可以用于展示静态的数据集合,或者通过 JavaScript 动态地修改和更新数据。ListModel 还支持排序、过滤和分组等常见的数据操作。

QtQml.XmlListModels

QtQml.XmlListModel 是 Qt QML 模块中的另一个类,用于从 XML 数据源中创建数据模型。它可以解析 XML 数据,并将其转换为可供 QML 使用的模型数据。XmlListModel 支持对 XML 数据进行查询和筛选,以便提取所需的数据。这对于从 Web 服务或其他具有 XML 输出的数据源中获取数据非常有用。

TableModel

TableModel 是一个用于创建和管理表格数据模型的自定义类。与 ListModel 不同,TableModel 提供了一种基于表格结构的数据模型。它支持多列数据,并且可以通过自定义的行和列索引来访问和操作数据。TableModel 可以用于展示和编辑具有表格布局的数据集合,例如数据库查询结果。

视图类型

视图类型主要是 Flickable 的几个子类型,包括列表视图 ListView、网格视图 GridView、表格视图 TableView、及其子类型树视图 TreeView

在QML中,有多种视图类型可用于将数据呈现给用户。以下是一些常见的QML视图类型:

ListView:

ListView 是一个常用的视图类型,用于在垂直方向上展示可滚动的列表。它可以根据数据模型自动生成多个项目,并支持自定义的项目委托来定义每个项目的外观和交互。ListView 还支持滚动、分页和动画效果等功能。

GridView:

GridView 是一个用于展示网格布局的视图类型。它以二维的方式呈现数据,可以在水平和垂直方向上滚动。GridView 提供了自动布局和调整大小的功能,可以根据项目的尺寸和可用空间自动调整项目的位置和大小。

PathView:

PathView 是一个基于路径的视图类型,可以在指定的路径上展示项目。它可以在曲线、圆形、椭圆等不同的路径上显示项目,并支持滑动、缩放和旋转等动画效果。PathView 可用于创建具有非线性布局的视图,如圆形菜单、旋转木马效果等。

TableView:

TableView 是一个用于展示表格数据的视图类型。它以表格形式显示数据,每个项目位于行和列的交叉点上。TableView 支持水平和垂直滚动,并提供了排序、过滤和编辑等功能,使开发者能够展示和操作结构化的数据。

FlipView:

FlipView 是一个可用于创建可翻页的视图类型。它以水平或垂直方向呈现项目,并支持用户通过滑动手势来翻页。FlipView 可用于创建类似于图片浏览器、书籍阅读器等需要翻页功能的应用程序。

TreeView

TreeView 是一种用于展示分层数据结构的视图类型。它以树形结构的方式呈现数据,每个项目可以包含子项目,从而形成层级结构。TreeView 提供了一种直观的方式来浏览和管理具有父子关系的数据。

ColumnView

ColumnView 是一种用于展示列布局的视图类型。它以垂直列的方式呈现数据,可以实现多列数据的布局和展示。ColumnView 提供了一种灵活的方式来显示和管理具有多列数据的项目。

委托选择器 DelegateChooser

Qt.lab.qmlmodels 模块还提供了一个 DelegateChooser 类型,允许视图对模型中不同类型的项目使用不同的委托。DelegateChooser 中可以封装一组 DelegateChoices ,使用他们可以根据模型数据的不同角色的值或者索引来提供需要的委托项目。

暂时理解为不同场景的不同视图

在 QML 中,DelegateChooser 是一种用于选择和应用项委托的工具。它允许根据某些条件来选择不同的项委托,并将其应用于特定的数据项。它通常与 QML 视图类型(如 ListView、GridView、ColumnView 等)一起使用,以根据条件为每个数据项选择不同的委托。

DelegateChooser 由以下几个关键组件组成:

  1. DelegateChoice
    DelegateChoice 是 DelegateChooser 的子组件,用于定义一个委托选项。它可以包含一个条件表达式和一个项委托。当条件表达式为真时,DelegateChooser 将选择并应用该项委托。
  2. DelegateChooser
    DelegateChooser 是一个用于选择和应用项委托的组件。它包含一个或多个 DelegateChoice 子组件。DelegateChooser 会按照它们的顺序评估 DelegateChoice,选择第一个满足条件的委托,并将其应用于对应的数据项。

使用 DelegateChooser 可以根据不同的条件选择和应用不同的项委托,例如根据数据项的类型、属性值或其他自定义条件。这使得可以根据数据的不同特征,为每个数据项选择适当的外观和交互方式。

示例

以下是一个简单的示例,展示如何使用 DelegateChooser 在 ListView 中选择委托:

ListView {
    width: 200
    height: 400
    model: myModel

    DelegateChooser {
        DelegateChoice {
            when: modelData > 10
            delegate: Rectangle {
                width: 100
                height: 50
                color: "red"
                Text {
                    text: modelData
                    color: "white"
                    anchors.centerIn: parent
                }
            }
        }

        DelegateChoice {
            when: modelData <= 10
            delegate: Rectangle {
                width: 100
                height: 50
                color: "green"
                Text {
                    text: modelData
                    color: "white"
                    anchors.centerIn: parent
                }
            }
        }
    }
}

在上述示例中,根据模型数据的值,DelegateChooser 选择并应用不同的项委托。当模型数据大于 10 时,选择红色的矩形委托,否则选择绿色的矩形委托。

使用 DelegateChooser 可以根据条件为不同的数据项选择不同的委托,并实现更灵活的视图展示和交互行为。

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

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

相关文章

C# 特性(一)——什么是特性

目录 什么是特性 Serializable DllImport Obsolete Conditional Attribute类 自定义特性 AttributeUsage的使用例子 特性非常常见&#xff0c;官方解释为&#xff1a; 特性&#xff08;Attribute&#xff09;是用于在运行时传递程序中各种元素&#xff08;比如类、方法…

【批处理DOS-CMD命令-汇总和小结】上网和通信相关命令-查看路由表,查看网卡GUID UUID(route、getmac)

一、查看、编辑路由表&#xff08;route&#xff09; 首先我们看看route命令的帮助信息&#xff0c;可以发现这个命令其实就是用来查看路由表、以及添加&#xff08;或编辑、删除&#xff09;路由项目的。 路由项目是指操作系统对数据包的导向规则&#xff0c;往往包括目标IP…

《统计学习方法》——条件随机场#习题解答#

引言 这是统计学习方法第十一章条件随机场的阅读笔记&#xff0c;包含所有公式的详细推导。 条件随机场(conditional random field,CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型&#xff0c;其特点是假设输出随机变量构成马尔可夫随机场。 建议先阅…

【计算机网络】为什么是TCP四次挥手,可以变成三次吗?

【计算机网络】为什么是TCP四次挥手&#xff0c;可以变成三次吗&#xff1f; 文章目录 【计算机网络】为什么是TCP四次挥手&#xff0c;可以变成三次吗&#xff1f;引言TCP 四次挥手为什么 TCP 挥手需要四次呢&#xff1f;粗暴关闭 vs 优雅关闭 什么情况会出现三次挥手&#xf…

MySQL—SQL优化详解(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

FFmpeg 内存模型分析

标题 1. 内存模型图2. 分析流程3.追溯本源————源码分析3.1 AVPacket队列 什么时候生成的&#xff1f; 4 .AVPacket和AVFrame相关操作API5. av_read_frame源码分析 1. 内存模型图 2. 分析流程 我们解复用后,媒体流数据就会被分离开来,分别生成对应AVPacketList,然后通过av_…

BART论文解读

1 概述 全称&#xff1a;Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension。BART来源于Bidirectional and Auto-Regressive Transformers发表时间: 2019.10.29团队&#xff1a;Facebook AI Paper地址​arxiv.o…

chatgpt赋能python:Python怎么求解方程

Python怎么求解方程 在数学中&#xff0c;求解方程是一种基本的技能。Python作为一种广泛应用于科学计算和数据分析领域的编程语言&#xff0c;可以帮助我们求解各种类型的方程。Python提供了多个库和函数&#xff0c;使得求解方程在Python中变得非常轻松。 一元方程求解 一…

Android Framework分析SystemServer进程

SystemServer进程是Android系统的核心进程&#xff0c;运行在Android系统启动后&#xff0c;负责管理和加载系统服务。本文将介绍SystemServer进程的详细结构和工作原理&#xff0c;并使用代码注释的方式阐述其关键部分代码。 结构&#xff1a; SystemServer进程的核心是Syste…

SSH基本概念,带你了解SSH

1、SSH基本概念 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于在不安全的网络中安全地传输数据。它是一种加密协议&#xff0c;可以保护数据在传输过程中不被窃取、篡改或伪造。SSH协议最初是由芬兰的Tatu Ylonen开发的&#xff0c;现在已经成为了一…

Hadoop集群之模板虚拟机的安装

Hadoop集群之模板虚拟机的安装 文章目录 Hadoop集群之模板虚拟机的安装0. 写在前面1. CentOS的安装1.1 配置电脑1.1.1 进入VMware1.1.2 自定义新的虚拟机1.1.3 解决虚拟机的兼容性1.1.4 选择当前虚拟机的操作系统1.1.5 选择虚拟机将来需要安装的系统1.1.6 电脑的具体配置1.1.7 …

KUKA机器人通过示教器进行关机冷启动的具体方法演示

KUKA机器人通过示教器进行关机冷启动的具体方法演示 如下图所示,首先需要登录管理员权限,默认密码:KUKA,然后点击左上角的机器人图标进行菜单选项,找到并点击“关机”选项, 如下图所示,找到并点击“重新启动控制系统PC”, 如下图所示,此时系统提示:确实要重新启动…

chatgpt赋能python:Python生成序列的方法详解

Python生成序列的方法详解 在Python编程中&#xff0c;序列&#xff08;Sequence&#xff09;是常用的数据类型之一。序列是有序的&#xff0c;可以通过下标访问其中的元素。Python中有多种方法可以生成序列&#xff0c;下面将对常用的几种方法进行详细介绍。 利用range函数生…

2023-06-16 Android Studio 使用CMakeList编译JNI ,最简单的demo源码

一、代码结构图&#xff0c;代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

国内大模型研究

自从chatgpt发布以来&#xff0c;国内大模型发展非常迅速。我对这项目技术也保持了非常多的持续关注&#xff0c;我一直认识&#xff0c;chatGPT以及其他GPT会给社会带来更大的变革。经过专业训练的大模型可以替代部分客服&#xff0c;部分程序员&#xff0c;部分美工&#xff…

Vue全家桶实战 从零独立开发企业级电商系统(免费升级Vue3.0)

Vue全家桶高仿小米商城–项目简介 文章目录 Vue全家桶高仿小米商城--项目简介电商项目选型--小米商城的页面流程&#xff1a;业务开发流程&#xff1a;项目内容&#xff1a;商城组件部分&#xff1a;课程所包含的知识图谱&#xff1a;章节介绍&#xff1a; 商城的界面展示&…

基于web漏洞扫描及分析系统设计_kaic

基于web漏洞扫描及分析系统设计 摘 要 随着信息技术的发展和网络应用在我国的普及&#xff0c;针对我国境内信息系统的恶意网络攻击也越来越多&#xff0c;并且随着黑客攻击技术的不断地更新&#xff0c;网络犯罪行为变得越来越难以应对&#xff0c;用户日常访问的网站是否安全…

【八大排序(六)】快排终极篇-快速排序非递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 快排非递归版 1. 前情回顾2. 快排非递归基…

A100 GPU服务器安装CUDNN教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

从Window中先多瞥几眼

JavaFx17官方文档中有如下的描述: Window类是一个顶层窗口类,在其中可以承载场景,并与用户交互。窗口可以是Stage、PopupWindow或其他类似的顶层窗口。 JavaFX Stage类是顶级的JavaFX容器。初级阶段由平台搭建。其他Stage对象可以由应用程序构造。 许多Stage属性是只读的…