【Qt之Model/View】编程

news2024/11/17 10:37:57

Model/View编程介绍

Qt包含一组使用模型/视图架构来管理数据和用户呈现的关系的视图类。此架构引入的功能分离使开发人员可以更灵活地自定义项的呈现方式,并提供标准的模型接口,以允许各种数据源与现有项视图一起使用。在本文档中,我们简要介绍了模型/视图范例,概述了涉及的概念,并描述了项视图系统的架构。解释了架构中的每个组件,并提供了示例,展示如何使用提供的类。

模型/视图架构

模型-视图-控制器(MVC)是一种来自Smalltalk的设计模式,通常用于构建用户界面。在《设计模式》中,Gamma等人写道:
MVC由三种对象组成。模型是应用程序对象,视图是其屏幕呈现,控制器定义了用户界面对用户输入的反应方式。在MVC之前,用户界面设计倾向于将这些对象合并在一起。MVC将它们解耦以增加灵活性和重用性。
如果视图和控制器对象合并,则结果是模型/视图架构。这仍然将数据存储方式与呈现给用户的方式分开,但提供了一个基于相同原则的更简单的框架。这种分离使得可以在多个不同的视图中显示相同的数据,并实现新的视图类型,而不需要更改基本数据结构。为了允许灵活地处理用户输入,我们引入了委托的概念。在该框架中拥有委托的优点是,它允许自定义渲染和编辑数据项的方式。

模型/视图架构

在这里插入图片描述

模型与数据源通信,为架构中的其他组件提供接口。通信的性质取决于数据源类型和模型的实现方式。
视图从模型获取模型索引,这些是对数据项的引用。通过向模型提供模型索引,视图可以从数据源检索数据项。
在标准视图中,委托呈现数据项。当编辑项时,委托使用模型索引直接与模型通信。

一般情况下,模型/视图类可以分为上述三组:模型、视图和委托。这些组件的每个组件都由抽象类定义,它们提供常见的接口和某些情况下的默认实现。抽象类旨在被子类化以提供其他组件所期望的全部功能集;这也允许编写专门的组件。

模型、视图和委托使用信号和槽彼此通信:
来自模型的信号通知视图有关数据源中保存的数据的更改。
来自视图的信号提供有关用户与显示的项目交互的信息。
来自委托的信号在编辑期间用于告知模型和视图编辑器的状态。

模型

所有项模型都基于QAbstractItemModel类。此类定义了由视图和委托用于访问数据的接口。数据本身不必存储在模型中,它可以存储在由单独的类、文件、数据库或其他应用程序组件提供的数据结构或存储库中。

有关模型的基本概念在“模型类”部分中介绍。
QAbstractItemModel提供一个灵活的数据接口,以处理以表格、列表和树形式表示数据的视图。然而,当实现用于列表和表格样式的新模型时,QAbstractListModel和QAbstractTableModel类是更好的起点,因为它们提供了适当的常见功能的默认实现。这些类中的每一个都可以被子类化以提供支持特定类型的列表和表格的模型。

子类化模型的过程在“创建新模型”部分中讨论。
Qt提供了一些可直接使用的模型来处理数据项:
QStringListModel用于存储字符串列表。
QStandardItemModel管理包含任意数据的更复杂的树形结构的项目。
QFileSystemModel提供有关本地文件系统中的文件和目录的信息。
QSqlQueryModel,QSqlTableModel和QSqlRelationalTableModel用于使用模型/视图惯例访问数据库。

如果这些标准模型不满足您的要求,您可以子类化QAbstractItemModel、QAbstractListModel或QAbstractTableModel来创建自己的自定义模型。

视图

针对不同类型的视图提供了完整的实现:QListView显示项目列表,QTableView以表格形式显示模型中的数据,QTreeView按分层列表显示模型数据项。这些类中的每一个都基于QAbstractItemView抽象基类。尽管这些类是可直接使用的实现,但它们也可以被子类化以提供自定义视图。
可用的视图在“视图类”部分中进行了检查。

委托

QAbstractItemDelegate是模型/视图框架中委托的抽象基类。默认委托实现由QStyledItemDelegate提供,并且Qt的标准视图使用它作为默认委托。但是,QStyledItemDelegate和QItemDelegate是独立的替代方案,用于在视图中绘制并为项目提供编辑器。它们之间的区别在于QStyledItemDelegate使用当前样式来绘制其项。因此,我们建议在实现自定义委托或使用Qt样式表时将QStyledItemDelegate用作基类。

代表在“委托类”部分中进行了描述。

排序

在模型/视图架构中有两种处理排序的方法;选择哪种方法取决于您的底层模型。
如果您的模型是可排序的,即如果它重新实现了QAbstractItemModel :: sort()函数,则QTableView和QTreeView都提供API,可以使您以编程方式对模型数据进行排序。此外,您可以通过将QHeaderView :: sortIndicatorChanged()信号连接到QTableView :: sortByColumn()插槽或QTreeView :: sortByColumn()插槽来启用交互式排序(即允许用户通过点击视图的标题栏对数据进行排序)。
如果您的模型没有所需的接口,或者想要使用列表视图来呈现数据,则可以使用代理模型在呈现数据之前转换模型的结构。这在“代理模型”部分中详细介绍。

方便类

为利用Qt的基于项的项视图和表格类的应用程序而派生了许多方便的类。它们不是旨在被子类化的。
此类类别的示例包括QListWidget,QTreeWidget和QTableWidget。
这些类比视图类不够灵活,不能与任意模型一起使用。我们建议您在项视图中使用模型/视图方法来处理数据,除非您强烈需要基于项的类集。
如果您希望利用模型/视图方法提供的功能,同时仍然使用基于项的界面,请考虑使用视图类,如QListView,QTableView和QTreeView与QStandardItemModel。

未完待续。

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

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

相关文章

qemu 之 uboot、linux 启动

目录 编译uboot、kernel 编译启动从 uboot 中引导启动 linux注参考 本文主要说明 arm64 在 qemu 上的相关启动。 编译 使用的是 qemu-8.1.1 版本,编译命令如下: ../configure --cc/usr/local/bin/gcc --prefix/home/XXX/qemu_out --enable-virtfs --enable-slir…

网络原理-UDP/TCP详解

一. UDP协议 UDP协议端格式 由上图可以看出,一个UDP报文最大长度就是65535. • 16位长度,表示整个数据报(UDP首部UDP数据)的最大长度(注意,这里的16位UDP长度只是一个标识这个数据报长度的字段&#xff0…

[Android]修改应用包名、名称、版本号、Icon以及环境判断和打包

1.修改包名 在Android Studio中更改项目的包名涉及几个步骤: 打开项目结构: 在Android Studio中,确保您处于Android视图模式(在左侧面板顶部有一个下拉菜单可以选择)。 重命名包名: 在项目视图中,找到您的包名&…

Linux如何修改主机名(hostname)(亲测可用)

文章目录 背景Linux如何修改主机名(hostname)方法方法1. 使用 hostnamectl 命令示例 2. 编辑 /etc/hostname 文件注意事项 背景 我创建虚拟机的时候没设置主机名,现在显示localhost,有点尴尬😅: 需要重新设…

深入了解JVM和垃圾回收算法

1.什么是JVM? JVM是Java虚拟机(Java Virtual Machine)的缩写,是Java程序运行的核心组件。JVM是一个虚拟的计算机,它提供了一个独立的运行环境,可以在不同的操作系统上运行Java程序。 2.如何判断可回收垃圾…

单链表按位序与指定结点 删除

按位序删除(带头结点) #define NULL 0 #include<stdlib.h>typedef struct LNode {int data;struct LNode* next; }LNode, * LinkList;//按位序删除&#xff08;带头结点&#xff09; bool ListInsert(LinkList& L, int i, int& e) {if (i < 1)return false;L…

【Java 进阶篇】JQuery DOM操作:轻松驾驭网页内容的魔法

在前端开发的舞台上&#xff0c;DOM&#xff08;文档对象模型&#xff09;是我们与网页内容互动的关键。而JQuery作为一个轻量级的JavaScript库&#xff0c;为我们提供了便捷而强大的DOM操作工具。在本篇博客中&#xff0c;我们将深入探讨JQuery的DOM内容操作&#xff0c;揭开这…

基于Matlab+ AlexNet神经网络的动物识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Matlab和AlexNet神经网络的动物识别系统可以用于自然图像识别等场景&#xff0c;以下是一个基本的介绍设计步骤…

ARM64 linux并发与同步之内存屏障

1.2 内存屏障 1.2.1 概念理解 原理部分比较苦涩难懂&#xff0c;我们先不过多详细介绍这部分的由来和经过&#xff0c;接下来着重讲解什么用途和实现&#xff1b; ARM64架构中提供了3条内存屏障指令。 数据存储屏障(Data Memory Barrier, DMB)指令。数据同步屏障(Data Synch…

Thinkphp8 - 连接多个数据库

// 数据库连接配置信息connections > [mysql > [// 数据库类型type > mysql,// 服务器地址hostname > 127.0.0.1,// 数据库名database > thinkphp,// 用户名username > env(DB_USER, root),// 密码password >…

Yolo自制detect训练

Install 把代码拉下来 GitHub - ultralytics/yolov5 at v5.0 然后 pip install -r requirements.txt 安装完了,运行一下detect.py即可 结果会保存在对应的目录下 Intro ├── data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验…

clouldcompare工具使用

文章目录 1.界面1.1 布局1.3 视觉显示方向1.4 放大镜1.5 建立旋转中心2.快速入门2.1 剪裁2.2 多点云拼接 1.界面 1.1 布局 参考&#xff1a;https://blog.csdn.net/lovely_yoshino/article/details/129595201 1.3 视觉显示方向 1.4 放大镜 1.5 建立旋转中心 2.快速入门 2.1 …

腾讯域名优惠卷领取

腾讯域名到到期了&#xff0c;听说申请此计划&#xff0c;可获得优惠卷&#xff0c;看到网上5年域名只需要10元&#xff0c;姑且试试看。 我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xff1a;https://cloud.tencent.com/developer/support-plan?in…

UE地形系统材质混合实现和Shader生成分析(UE5 5.2)

前言 随着电脑和手机硬件性能越来越高&#xff0c;游戏越来越追求大世界&#xff0c;而大世界非常核心的一环是地形系统&#xff0c;地形系统两大构成因素&#xff1a;高度和多材质混合&#xff0c;此篇文章介绍下UE4/UE5 地形的材质混合方案----基于WeightMap混合。 材质层 …

每日一题(LeetCode)----数组--长度最小的子数组

每日一题(LeetCode)----数组–长度最小的子数组 1.题目&#xff08; 209.长度最小的子数组&#xff09; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &…

敏捷开发是什么?敏捷开发流程是怎么样的?

1. 什么是敏捷开发&#xff1f; 敏捷开发是一种迭代、增量式的软件开发方法&#xff0c;旨在通过灵活、协作和快速响应变化的方式&#xff0c;提高开发团队的效率和产品的质量。相较于传统的瀑布式开发模型&#xff0c;敏捷开发更加注重用户需求的响应和团队协作&#xff0…

elastic-job 完结篇

一 elastic-job 1.1 案例场景分析 1.设置4个分片&#xff0c;10秒执行一次。 分片弹性扩容缩容机制测试&#xff1a; 测试1&#xff1a;测试窗口1不关闭&#xff0c;再次运行main方法查看控制台日志&#xff0c;注意修改application.properties中的 server.port&#xf…

7.运算符

目录 一.算数运算符 1、算术运算符 2、比较运算符 1、等号()用来判断数字、字符串和表达式是否相等。 2、安全等于运算符(<>) 3、不等于运算符(<>或者!) 4、小于或等于运算符(<) 5、小于运算符(<) 6、IS NULL(IS NULL)&#xff0c;IS NOT NULL 运算…

删除杀软回调 bypass EDR 研究

01 — 杀软或EDR内核回调简介 Windows x64 系统中&#xff0c;由于 PatchGuard 的限制&#xff0c;杀软或EDR正常情况下&#xff0c;几乎不能通过 hook 的方式&#xff0c;完成其对恶意软件的监控和查杀。那怎么办呢&#xff1f;别急&#xff0c;微软为我们提供了其他的方法&a…

2352 智能社区医院管理系统JSP【程序源码+文档+调试运行】

摘要 本文介绍了一个智能社区医院管理系统的设计和实现。该系统包括管理员、护工和医生三种用户&#xff0c;具有社区资料管理、药品管理、挂号管理和系统管理等功能。通过数据库设计和界面设计&#xff0c;实现了用户友好的操作体验和数据管理。经过测试和优化&#xff0c;系…