【Qt之模型视图】1. 模型和视图架构

1. 模型/视图架构是什么及有什么用

  1. MVC(Model-View-Control)是一种源自Smalltalk的设计模式,通常用于构建用户界面。
    MVC由三种类型的对象组成。模型是应用对象,用来表示数据;视图是模型的用户界面,用来显示数据;控制器定义了用户界面对用户输入的反应方式。在MVC之前,用户界面设计往往将这些对象混为一谈。MVC将它们解耦,以增加灵活性和重用性。
    在之前,可能编程就是,在一个类中,将UI、Data、还有整个控制都写在一起,耦合高,不好拆分。当将之前编写的模块引入到新的项目中时,该模块可能会有很多新项目用不到的内容,还需要手动删除,删除中还会碰到各种问题。
  2. 如果将视图和控制器对象合并,就会得到模型/视图架构。这仍然将数据存储与呈现方式分离,但提供了一个基于相同原则的更简单的框架。这种分离使得可以在多个不同视图中显示相同的数据,并且可以实现新类型的视图,而无需更改底层数据结构。为了实现对用户输入的灵活处理,引入了委托的概念。在该框架中,使用委托的好处在于可以自定义数据项的渲染和编辑方式。
  3. Qt库提供了许多预定义的模型和视图类,如QStandardItemModel、QListView、QTableView等,开发人员可以根据自己的需求选择合适的类来建立模型和视图。同时,开发人员也可以自定义模型和视图类来适应特定的应用场景。

模型/视图,如下所示:
image.png

2. 数据的存储方式可以是多样化的

数据本身并不一定存储在模型中,可以储存在一个数据结构,或者一个文件,一个数据库,或者其他组件中,都是有可能的。
如:一个数据类型,QStringList

QStringList sl;
sl << QString("1") << QString("2") << QString("3") << QString("4") << QString("5") << QString("6");

如果视图是列表,那sl可以显示为6行1列;如果视图为表格,则根据表格行列,可显示为对应的视图;但数据还是那个数据,不变。

3. 架构组成部分

一般来说,模型/视图架构可以分为3类:模型、视图和委托。
在Qt中,每个类都有一个抽象基类来定义,提供了一些通用接口和一些功能的默认实现;抽象类呢,就允许编写自定义的组件。
其中,这三者之间的交互是通过信号和槽来实现:

  • 当数据源中的数据变化时,模型发出信号通知视图;
  • 当用户与显示的项目交互时,视图发出信号提供交互信息;
  • 当编辑项目时,委托发出信号,通知视图和模型其状态。

3.1 模型

查看其手册,发现所有模型类的基类都是QAbstractItemModel类。
该类提供了一些接口,用于让视图和委托访问数据。
QAbstractItemModel提供了一个灵活的数据接口,可以处理以表格、列表和树形形式表示数据的视图。
但是,当为列表和类似表格的数据结构实现新模型时,可以继承至QAbstractListModelQAbstractTableModel类,因为它们提供了列表和表格等常用的一些函数。每个类都可以被子类化,以提供支持特殊类型的列表和表格的模型。
Qt提供了一些现成的模型,可以用来处理数据项:

  • QStringListModel 用于存储简单的 QString 项列表。
  • QStandardItemModel 管理更复杂的树形结构的项,每个项可以包含任意数据。
  • QFileSystemModel 提供关于本地文件系统中的文件和目录的信息。
  • QSqlQueryModel、QSqlTableModel 和 QSqlRelationalTableModel 用于使用模型/视图约定访问数据库。

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

3.2 视图

Qt提供了几种不同类型的视图:

  • QListView将数据项显示为一个列表;
  • QTableView在表格中显示模型的数据;
  • QTreeView以分层列表的形式显示模型的项目数据。

这些类都是基于QAbstractItemView抽象基类。这些类可以直接使用,也可以通过子类化来提供自定义视图。

3.3 委托

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

4. 示例

以上说了MVC的作用及模型、视图、委托的介绍,下面是一个示例进行简单说明。
QFileSystemModel类为本地文件系统提供了一个数据模型,本身不包含任何的数据,它代表了本地文件系统中的文件和目录。
该类提供对本地文件系统的访问,提供了重命名和删除文件和目录的功能,以及创建新目录的功能。在最简单的情况下,它可以与适当的显示部件一起用作浏览器或筛选器的一部分。
QFileSystemModel可以使用QAbstractItemModel提供的标准接口访问,但它还提供了一些特定于目录模型的方便函数。fileInfo()、isDir()、fileName()和filePath()函数提供了与模型中项目相关的底层文件和目录的信息。可以使用mkdir()和rmdir()函数创建和删除目录。
QFileSystemModel类可以和QListViewQTreeView一起用来显示内容。

#include <QDir>
#include <QTreeView>
#include <QListView>
#include <QFileSystemModel>
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QListView* pLV = new QListView();QTreeView* pTW = new QTreeView(this);QFileSystemModel* pModel = new QFileSystemModel(this);pTW->setModel(pModel);pModel->setRootPath(QDir::currentPath());pTW->setRootIndex(pModel->index(QDir::currentPath()));setCentralWidget(pTW);pLV->setModel(pModel);pLV->setRootIndex(pModel->index(QDir::currentPath()));pLV->show();
}

image.png
image.png
同一个模型,根据视图不同,显示不同的方式;由此可看到模型/视图的好处。

5. 结论

如果是大量数据显示,或者想有更高的控制权,建议使用View/Model。

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

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

相关文章

【征服redis5】redis的Redisson客户端

目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例&#xff1a;优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建&#xff0c;并在…

瑞_Java开发手册_(七)设计规约

文章目录 设计规约的意义设计规约 &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的设计规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约&#xff0c;所以本系列专栏主要以这本书进行讲解和拓展&#xff0c;有需要的小伙伴可以点击链接…

Java数据结构实现数组(配套习题)

数据结构 数组 一组相同数据类型的集合 特点 数组在内存中是连续分配的创建时要指明数组的大小数组名代表首地址,索引从0开始,到数组的长度-1数组一旦创建好,大小不可以改变使用索引 获取索引位置的值 arr[index]修改 arr[index] val删除 (假删除)遍历,将数组中的元素,依次…

在全志T113-i平台上实现H.265视频解码步骤详解

H.265&#xff0c;也被称为HEVC(HighEfficiency Video Coding)&#xff0c;作为H.264的继任者&#xff0c;提供了更好的视频压缩和更高的视频质。H.265通过引入更多先进的编码技术&#xff0c;如更强大的运动估计和更高效的变换编码&#xff0c;对比H.264进行了改进。这些改进使…

【latex】参考文献排版前移,在最前面引用\usepackage{url}

【LaTeX】参考文献排版前移&#xff0c;在最前面引用\usepackage{url} 写在最前面完整解决步骤请教申申latex编译报错解决方案 写在最前面 参考文献从21开始排版前移了 解决方案&#xff1a;在最前面加一行 \usepackage{url}完整解决步骤 请教申申 申申yyds&#xff01;&am…

Java NIO (一)简介

1 NIO简介 在1.4版本之前&#xff0c;Java NIO类库是阻塞IO&#xff0c;从1.4版本开始&#xff0c;引进了新的异步IO库&#xff0c;被称为Java New IO类库&#xff0c;简称为Java NIO。New IO类库的目的 就是要让Java支持非阻塞IO。 Java NIO类库包含三个核心组件&#xff1a; …

Python 算术运算符:解码数字世界的算术密码

算术运算是计算机编程中最基本和常见的运算之一。在 Python 中&#xff0c;算术运算符提供了一组功能强大的操作符&#xff0c;使得我们能够对数字进行加减乘除等各种数学计算。本文将深入探讨 Python 中的算术运算符&#xff0c;包括常见的算术运算符、使用注意事项以及在实际…

线性回归理论+实战

线性回归 什么是线性回归 3.1. 线性回归 — 动手学深度学习 2.0.0 documentation (d2l.ai) 模型 损失函数 模型拟合&#xff08;fit&#xff09;数据之前&#xff0c;我们需要确定一个拟合程度的度量。 损失函数&#xff08;loss function&#xff09;能够量化目标的实际值…

导入失败,报错:“too many filtered rows xxx, “ErrorURL“:“

一、问题&#xff1a; 注&#xff1a;前面能正常写入&#xff0c;突然就报错&#xff0c;导入失败&#xff0c;报错&#xff1a;“too many filtered rows xxx, "ErrorURL":" {"TxnId":769494,"Label":"datax_doris_writer_bf176078-…

物联网中的通信技术

阅读引言&#xff1a; 本文主要大致为大家带来物联网中的常见的通信方式的知识梳理。 目录 一、概述 二、无线通信技术 1.物联网电子标签 RFID 1.1 RFID 概念 1.2 RFID 系统组成 2.WI-FI技术 3.UWB技术 4.ZigBee技术 5.NFC技术 6.蓝牙技术 7.EnOcean技术 一、概述 物…

【服务器数据恢复】服务器迁移数据时lun数据丢失的数据恢复案例

服务器数据恢复环境&服务器故障&#xff1a; 一台安装Windows操作系统的服务器。工作人员在迁移该服务器中数据时突然无法读取数据&#xff0c;服务器管理界面出现报错。经过检查发现服务器中一个lun的数据丢失。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有磁盘…

SpringBoot+MybatisPlus+dynamic-datasources实现连接Postgresql和mysql多数据源

场景 dynamic-datasource-spring-boot-starter实现动态数据源Mysql和Sqlserver&#xff1a; dynamic-datasource-spring-boot-starter实现动态数据源Mysql和Sqlserver_dynamic-datasource-spring-boot-starter mysql sqlse-CSDN博客 SpringBoot中整合MybatisPlus快速实现Mys…

利用docker的LNMP

目录 服务器环境 任务需求 服务搭建 Nginx Mysql Php 启动 wordpress 服务 服务器环境 容器 操作系统 IP地址 主要软件 nginx CentOS 7 172.20.0.10 Docker-Nginx mysql CentOS 7 172.20.0.20 Docker-Mysql php CentOS 7 172.2…

详解ISIS动态路由协议

华子目录 前言应用场景历史起源ISIS路由计算过程ISIS的地址结构ISIS路由器分类ISIS邻居关系的建立P2PMA ISIS中的DIS与OSPF中DR的对比链路状态信息的交互ISIS的最短路径优先算法&#xff08;SPF&#xff09;ISIS区域划分ISIS区域间路由访问原理ISIS与OSPF的不同ISIS与OSPF的术语…

Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现

什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的微…

如何安装下载激活MathType?2024最新免费MathType许可证

第一步&#xff1a;请先从这里下载安装MathType&#xff1a; 第二步&#xff1a;下载完成后&#xff0c;双击下载的MathType Desktop安装程序文件。 在Mac上&#xff0c;这将在单独的窗口中打开它&#xff0c;因此在该窗口中双击“ MathType Desktop Installer…”以运行安装…

TQ7.2WS acid,Tide Quencher 7.2WS 酸,能够降低荧光信号的强度

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Tide Quencher 7.2WS acid&#xff0c;TQ7.2WS acid&#xff0c;Tide Quencher 7.2WS 酸 &#xff0c;TQ7.2WS 酸 一、基本信息 产品简介&#xff1a;The fluorescence quenching agent Tide Quencher 7.2WS acid h…

win10 系统维护

电脑崩溃之后&#xff0c;我发现维护系统还是很重要的一件事情。比如软件尽可能装D盘&#xff0c;C盘&#xff08;系统盘&#xff09;尽可能不要存储数据等等。接着&#xff0c;就是如何让系统更易用&#xff0c;因此我在这里分享我的使用方式&#xff0c;以后就可以随便重装系…

微信小程序防止截屏录屏

一、使用css添加水印 使用微信小程序原生的view和css给屏幕添加水印这样可以防止用户将小程序内的隐私数据进行截图或者录屏分享导致信息泄露&#xff0c;给小程序添加一个水印浮层。这样即使被截图或者拍照&#xff0c;也能轻松地确定泄露的源头。效果图如下&#xff1a; 代码…

LeetCode刷题---基本计算器

解题思路&#xff1a; 根据题意&#xff0c;字符串中包含的运算符只有和- 使用辅助栈的方法来解决该问题 定义结果集res和符号位sign(用于判断对下一数的加减操作),接着对字符串进行遍历。 如果当前字符为数字字符&#xff0c;判断当前字符的下一个字符是否也是数字字符&#x…