【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.hqwc.cn/news/411010.html

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

相关文章

openssl3.2 - 官方demo学习 - test - certs

文章目录 openssl3.2 - 官方demo学习 - test - certs概述笔记.sh的执行语句打印的方法要修改的实际函数END openssl3.2 - 官方demo学习 - test - certs 概述 官方demos目录有证书操作的例子 已经做了笔记 openssl3.2 - 官方demo学习 - certs 但是这个demos/certs目录的脚本,…

VC++中使用OpenCV读取图像、读取本地视频、读取摄像头并实时显示

VC中使用OpenCV读取图像、读取本地视频、读取摄像头并实时显示 最近闲着跟着油管博主murtazahassan&#xff0c;学习了一下LEARN OPENCV C in 4 HOURS | Including 3x Projects | Computer Vision&#xff0c;对应的Github源代码地址为&#xff1a;Learn-OpenCV-cpp-in-4-Hour…

智能手表喇叭无气孔导致老化播放后没声音

智能音箱喇叭老化播放后没声音 智能手表要做防水&#xff0c;在外壳上打了防水胶&#xff0c;结果出现播放突然没声音的现象&#xff0e; 原因 一直播放&#xff0c;设备温度升高&#xff0c;因为做了防水密闭导致喇叭腔体气压异常&#xff0c;导致播放没声音&#xff0e; …

ArcGIS初始化软件界面Normal.mxt

ArcGIS有时候永久了&#xff0c;或者呢突然不自觉软件界面乱了&#xff0c;或者一些窗口打开却找不到&#xff01; 这时候可以去删除arcgis的界面配置文件&#xff0c;Normal.mxt 删除后再打开软件&#xff0c;软件界面就会回到初始化设置了&#xff01; 文件所在的路径&…

Git将某个文件合并到指定分支

企业开发中&#xff0c;经常会单独拉分支去做自己的需求开发&#xff0c;但是某些时候一些公共的配置我们需要从主线pull&#xff0c;这时候整个分支merge显然不合适 1.切换至待合并文件的分支 git checkout <branch>2.将目标分支的单个文件合并到当前分支 git checkou…

Java-NIO 开篇(1)

NIO简介 高性能的Java通信&#xff0c;离不开Java NIO组件&#xff0c;现在主流的技术框架或中间件服务器&#xff0c;都使用了Java NIO组件&#xff0c;譬如Tomcat、 Jetty、 Netty、Redis、RabbitMQ等的网络通信模块。在1.4版本之前&#xff0c; Java IO类库是阻塞式IO&…

HCIP之BGP小实验

华子目录 实验拓扑及要求规划IP地址和网段实验步骤配置IP地址先让AS内部通建立BGP邻居查看邻居关系修改ospf中环回的接口网络类型宣告路由R1上有两个环回分别为192.168.1.0/24和192.168.2.0/24&#xff0c;只允许学到汇总和1.0R7上有两个环回172.16.1.0/24和172.16.2.0/24&…

浅谈双碳背景下能耗在线监测系统在节能管理中的实现

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;开展能耗在线监测系统建设&#xff0c;对加强政府部门和企业节能管理中的应用前景&#xff0c;分析系统在能源消费预测分析、能效对标、节能监察、能源精细化管理、用能权交易、宣传推广等方面的应用成效&…

Kafka生产消费流程

Kafka生产消费流程 1.Kafka一条消息发送和消费的流程图(非集群) 2.三种发送方式 准备工作 创建maven工程&#xff0c;引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.3.1…

高通sm7250与765G芯片是什么关系?(一百八十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

[自动化分布式] Zabbix自动发现与自动注册

abbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大 部署 添加zabb…

TCP的三次握手,四次挥手

三次握手 第一次握手&#xff1a;客户端发送SYN报文&#xff0c;井发送seq为x序列号给服务端&#xff0c;等待服务端的确认第二次握手&#xff1a;服务端发送SYNACK报文&#xff0c;并发送seq为Y的序列号&#xff0c;在确认序列号为x1第三次握手&#xff1a;客户端发送ACK报文&…