QT模型视图结构1

文章目录

  • Qt 模型视图结构概述(一)
    • 1、模型/视图结构基本原理
    • 2、模型
    • 3、视图
    • 4、代理
    • 5、简单实例

Qt 模型视图结构概述(一)

模型/视图结构是一种将数据存储界面展示分离的编程方法。模型存储数据,视图组件显示模型中的数据,在视图组件里修改的数据会被自动保存到模型里。模型的数据来源可以是内存中的字符串列表或二维表格型数据,也可以是数据库中的数据表,一种模型可以用不同的视图组件来显示数据,所以模型/视图结构是一种高效、灵活的编程结构。

1、模型/视图结构基本原理

GUI 程序的主要功能是可由用户在界面上编辑和修改数据,典型的如数据库应用程序。在数据库应用程序中,界面上的数据来源于数据库,用户在界面上修改数据,修改后的数据又保存到数据库。

​ 将界面与原始数据分离,又通过模型将界面和原始数据关联起来,从而实现界面与原始数据的交互操作,这是处理界面与数据的一种较好的方式。

​ Qt 使用模型/视图结构来处理这种关系,模型/视图的基本结构如图 1 所示,它包括以下几个部分。
在这里插入图片描述

图 1 模型/视图基本结构
  • 源数据(data)是原始数据,如数据库的一个数据表或 SQL查询结果、内存中的一个字符串列表或磁盘文件系统结构等。
  • 视图(view)也称为视图组件,是界面组件,视图从模型获得数据然后将其显示在界面上。Qt 提供一些常用的视图组件,如 QListViewQTreeViewQTableView 等。
  • 模型(model)也称为数据模型,与源数据通信,并为视图组件提供数据接口。它从源数据提取需要的数据,用于视图组件进行显示和编辑。Qt 中有一些预定义的模型类,如QStringListModel 是字符串列表的模型类,QSqlTableModel 是数据库中数据表的模型类。
  • 代理(delegate)在视图与模型之间交互操作时提供的临时编辑器。模型向视图提供数据是单向的,一般仅用于显示。当需要在视图上编辑数据时,代理会为编辑数据提供一个编辑器,这个编辑器获取模型的数据、接受用户编辑的数据后又将其提交给模型。例如在QTableView 组件上双击一个单元格来编辑数据时,在单元格里就会出现一个 QLineEdit 组件,这个编辑框就是代理提供的临时编辑器。
    由于通过模型/视图结构将源数据与显示和编辑界面分离,我们可以将一个模型在不同的视图中显示,也可以为一些特殊源数据设计自定义模型,或者在不修改模型的情况下设计特殊的视图组件。所以,模型/视图结构是一种高效、灵活的编程结构。
    模型、视图和代理使用信号和槽进行通信。当源数据发生变化时,模型发射信号通知视图组件;当用户在界面上操作数据时,视图组件发射信号表示操作信息;在编辑数据时,代理会发射信号告知模型和视图组件编辑器的状态。

2、模型

所有基于项(item)的模型类都是基于 QAbstractItemModel 类的,这个类定义了视图组件和代理存取数据的接口。模型只是在内存中临时存储数据,模型的数据来源可以是其他类、文件、数据库或任何数据源。

Qt 中几个主要的模型类的继承关系如图 2 所示。QAbstractItemModel 的父类是 QObject,所以模型类支持 Qt 的元对象系统。
在这里插入图片描述

图 2 模型类的继承关系

抽象模型类 QAbstractItemModel 不能直接用于创建实例对象,常用的几个模型类如表 1 所示。

表 1 常用的模型类
模型类功能
QFileSystemModel用于表示计算机上文件系统的模型类
QStringListModel用于表示字符串列表数据的模型类
QStandardItemModel标准的基于项的模型类,每个项是一个 QStandardItem 对象
QSqlQueryModel 用于表示数据库 SQL 查询结果的模型类
QSqlTableModel用于表示数据库的一个数据表的模型类

3、视图

视图就是用于显示模型中的数据的界面组件,Qt 提供的视图组件主要有以下几个。

表 2 常用的视图类
视图组件用于显示单列的列表数据,适用于一维数据的操作
QListView用于显示单列的列表数据,适用于一维数据的操作
QTreeView用于显示树状结构数据,适用于树状结构数据的操作
QTableView用于显示表格数据,适用于二维表格数据的操作
QColumnView用多个 QListView 显示树状结构数据,树状结构的一层用一个QListView显示
QUndoView用于显示 undo 指令栈内数据的视图组件,是 QListView 的子类

QListWidgetQTreeWidgetQTableWidget 这 3 个用于处理项数据的组件。这3 个类分别是 3 个视图类的子类,称为视图类的便利类(convenience class)。这些类的继承关系如图 3 所示。
在这里插入图片描述

图 3 视图类的继承关系

只需调用视图类的 setModel()函数为视图组件设置一个模型,模型的数据就可以显示在视图组件上。在视图组件上修改数据后,数据可以自动保存到模型里。视图组件的数据来源于模型,视图组件不存储数据。便利类则为组件的每个节点或单元格创建一个项,用项存储数据,例如对于 QTableWidget 类这个便利类,表格的每个单元格关联一个QTableWidgetItem 对象。便利类没有模型,它实际上是用项的方式替代了模型的功能,将界面与数据绑定。因此,便利类缺乏对大型数据源进行灵活处理的能力,只适用于小型数据的显示和编辑,而视图组件则会根据模型的数据内容自动显示,有助于减少编程工作量,使用起来也更灵活。

4、代理

代理就是在视图组件上为编辑数据提供的临时编辑器,例如在 QTableView 组件上编辑一个单元格的数据时,默认会提供一个 QLineEdit 编辑框。代理负责从模型获取相应的数据,然后将其显示在编辑器里,修改数据后又将编辑器里的数据保存到模型中。
QAbstractItemDelegate 是所有代理类的基类。它有两个子类, QItemDelegate 和QStyledItemDelegate ,这两个类的功能基本相同,而QStyledItemDelegate 能使用 Qt 样式表定义的当前样式绘制代理组件,所以,QStyledItemDelegate是视图组件使用的默认的代理类。
对于一些特殊的数据编辑需求,例如只允许输入整数时使用 QSpinBox 作为代理组件更合适,需要从列表中选择数据时则使用 QComboBox作为代理组件更好,这时就可以从 QStyledItemDelegate继承创建自定义代理类。

5、简单实例

展示了模型/视图类使用的简单实例 main.cpp


#include <QApplication>
#include <QSplitter>
#include <QFileSystemModel>
#include <QTreeView>
#include <QListView>int main(int argc, char *argv[])
{QApplication app(argc, argv);QSplitter *splitter = new QSplitter;QFileSystemModel *model = new QFileSystemModel;model->setRootPath(QDir::currentPath());QTreeView *tree = new QTreeView(splitter);tree->setModel(model);tree->setRootIndex(model->index(QDir::currentPath()));QListView *list = new QListView(splitter);list->setModel(model);list->setRootIndex(model->index(QDir::currentPath()));splitter->setWindowTitle("Two views onto the same file system model");splitter->show();return app.exec();
}

实例运行展示如下图
在这里插入图片描述

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

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

相关文章

Dubbo SPI源码

文章目录 Dubbo SPI使用方式AOP功能源码剖析SPI注解1.获取加载器2.获取拓展实例对象3.创建拓展类的实例对象 Dubbo SPI Dubbo 的 SPI&#xff08;Service Provider Interface&#xff09;机制是一种强大的扩展机制&#xff0c;它允许开发者在运行时动态地替换或增加框架的功能。…

SafaRi:弱监督引用表达式分割的自适应序列转换器

引用表达式分割(reference Expression Segmentation, RES)旨在提供文本所引用的图像(即引用表达式)中目标对象的分割掩码。 目前存在的挑战 1)现有的方法需要大规模的掩码注释。 2)此外&#xff0c;这种方法不能很好地推广到未见/零射击场景 改进 1&#xff09;提出了一个弱…

Cobbler 搭建方法

统信服务器操作系统行业版V20-1000c【Cobbler 搭建】手册 统信服务器操作系统行业版 V20版本上Cobbler 搭建方法 文章目录 功能概述一、使用范围二、cobbler工作流程1. Server 端2. Client 端三、 环境准备1. 测试环境告知,以提供配置时参考:2. 关闭防火墙、selinux:3. 注意…

优化深度学习模型训练过程:提升PASCAL VOC 2012数据集上Deeplabv3+模型训练效率的策略

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 优化说明&#xff1a; 避免重复下载和解压数据集&#xff1a;将downloadTrue改为downloadFalse&#xff0c;防止每次运行代码都重新下载和解压数据集&#xff0c;从而节省时间。 使用pin…

【C++】stack 和 queue 以及 容器适配器

文章目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 三、优先级队列1.优先级队列的介绍2. priority_queue的使用的使用3.模拟实现优先级队列 四、 容器适配器1.STL标准库中stack和queue的底层结构2.deque&#xff08;双端对列…

OS:初识操作系统——邂逅与启航

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;实践是检验真理的唯一标准&#xff01;&#xff01;&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 前言 各位uu好&#xff0c;现在我们要开始一个新的篇章——操作…

Geneformer AI 模型,有限数据也能解锁基因网络

目录 类似于 BERT 的单单元数据参考模型 NVIDIA Clara 工具组合用于药物研发 用于疾病建模的基础 AI 模型 Geneformer 是最近推出的 和功能强大的 AI 模型&#xff0c;可以通过从大量单细胞转录组数据中进行迁移学习来学习基因网络动力学和相互作用。借助此工具&#xff0c;…

misc合集(1)

[Week3] 这是一个压缩包 有密码&#xff0c;提示QmFzZUNURj8/Pz8/P0ZUQ2VzYUI base64解密是BaseCTF??????FTCesaB 猜测这应该是⼀个轴对称的密码 python ⽣成了密码字典&#xff0c;再通过 ARCHPR 进⾏字典爆破 lowercase abcdefghijklmnopqrstuvwxyz uppercase l…

java写s7和plc通讯

pom.xml <dependency><groupId>com.github.s7connector</groupId><artifactId>s7connector</artifactId><version>2.1</version></dependency>maven下载不了的&#xff0c;下载包&#xff0c;评论或者私自内免费给 DB212 类&a…

5.1 溪降技术:个人装备

Content 5.1 个人装备概览设备概览视频电子书&#xff1a;个人装备安全装备非安全装备 峡谷探险个人安全装备个人安全装备视频*安全扣结构*峡谷探险个人非安全装备 湿峡谷湿峡谷装备视频个人安全装备个人非安全装备 干峡谷干峡谷装备视频个人安全装备个人非安全装备 团队装备&a…

安全区域边界等保测评

1.边界防护 应保证跨越边界的访问和数据流通过边界设备提供的受控接口进行通信。 [测评方法] 1)应核查在网络边界处是否部署访问控制设备;网闸和防火墙2)应核查设备配置信息是否指定端口进行跨越边界的网络通信,指定端口是否配置并启用了安全策略acl 3)应采用其他技术手…

【网盘外快】百度网盘SVIP充值使用说明,如何通过软件自动充值获取新用户优惠?这篇文章给你正确答案。

资源地址&#xff1a; 此软件需要 网盘ck 才可以使用。 雷电模拟器下载地址&#xff1a;https://www.ldmnq.com/ 软件下载地址&#xff1a;https://wwi.lanzoup.com/b01qdiavzg 密码:666 模拟器使用说明&#xff1a; 1、调整模拟器分辨率调整为&#xff1a;540 X 960。 2、…

每天练打字1:今日状况——击键5第1遍

前言 首先说明一点&#xff0c;这个每天练打打字系列不会每天更新。因为本来练打字就不是一件太大的事&#xff0c;没必要为了更新而更新&#xff0c;但还是会做到每周一更新。以便于跟踪进度&#xff0c;监控目标是否达成。 今日练习情况 一、跟打情况 常用字中五百&#…

RockyLinux-软件实现RAID5

一、背景 RAID&#xff08;Redundant Array of Independent Disks&#xff0c;独立磁盘冗余阵列&#xff09;是一种将多个物理硬盘驱动器组合成单一逻辑单元的技术&#xff0c;目的是提高存储性能、可靠性和/或数据冗余度。虽然早期的名字中包含“独立”&#xff08;Independen…

【资料分析】常见的坑

in 比较或计数类问题 差别大的基期比较&#xff0c;可以直接用现期进行比较 注意单位可能不同&#xff01; 注意顺序是从小到大还是从大到小 以及老问题&#xff0c;名字本身就叫XX增量&#xff0c;XX增加值&#xff0c;而非还要另外去算的东东 给出的图表可能是不完整的 2…

通过SQL语句判断奇偶数的几种方法

文章目录 1. 准备数据2. 使用 % 判断奇偶数3. 使用 MOD 判断奇偶数4. 使用按位与运算符 & 1. 准备数据 假设我们有一张测试表test_numbers -- 创建测试表 CREATE TABLE test_numbers (number_value INT );-- 插入测试数据 INSERT INTO test_numbers (number_value) VALUE…

Qt:饿汉单例(附带单例使用和内存管理)

前言 本文主要写饿汉单例以及单例的释放&#xff0c;网上很多教程只有单例的创建&#xff0c;但是并没有告诉我们单例的内存管理&#xff0c;这就很头疼。 正文 饿汉式单例 // SingletonClass.h #ifndef SINGLETONCLASS_H #define SINGLETONCLASS_H #include <QObject&g…

PCIe进阶之TL:First/Last DW Byte Enables Rules Traffic Class Field

1 First/Last DW Byte Enables Rules & Attributes Field 1.1 First/Last DW Byte Enables Rules Byte Enable 包含在 Memory、I/O 和 Configuration Request 中。本文定义了相应的规则。Byte Enable 位于 header 的 byte 7 。对于 TH 字段值为 1 的 Memory Read Request…

【stm32笔记】使用rtt-studio与stm32CubeMx联合创建项目

使用rtt-studio与stm32CubeMx联合创建项目 创建rt-thread项目 设置项目信息 在项目资源管理器中“右击“&#xff0c;创建RRT studio 项目 双击“RT-Thread 项目“。 选择MCU&#xff0c;设置UART&#xff0c;以及调试方式。添加项目名称&#xff0c;点击“完成“按钮。 …

长春自闭症寄宿学校:开启创造力与艺术之旅

长春自闭症寄宿学校的启示&#xff1a;在广州星贝育园&#xff0c;自闭症儿童开启创造力与艺术之旅 当我们谈及自闭症儿童的教育与成长时&#xff0c;总有一股力量在推动着我们不断探索与创新。虽然题目中提及了“长春自闭症寄宿学校”&#xff0c;但本文将聚焦于广州的星贝育…