【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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 拦截系统睡眠、休眠

前言 在前一篇文章中&#xff0c;我们分析了以编程方式拦截 Winlogon 相关回调过程的具体做法&#xff0c;我们给出了一种拦截 RPC 异步回调的新方法——通过过滤特征码&#xff0c;我们可以对很多系统热键以及跟电源有关的操作做出“提前”响应。但是我们给出的代码并不能真正…

代码随想录第十八天 513 找树左下角的值 112 路径之和 106 从中序与后序遍历序列构造二叉树

LeetCode 513 找树左下角的值 题目描述 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 思路 1.确定递…

matlab appdesigner系列-常用14-树(复选框)

之前系列常用9&#xff0c;为单个复选框。树&#xff0c;就是多个复选框形成的选项组 示例&#xff1a;列举湖北省的几个城市 湖北省 武汉 宜昌 襄阳 荆州 1&#xff09;将树&#xff08;复选框&#xff09;拖拽到画布上&#xff0c;方式1就是&#xff1a;文字可以在右侧…

课题学习(十九)----Allan方差:陀螺仪噪声分析

一、介绍 Allan方差是一种分析时域数据序列的方法&#xff0c;用于测量振荡器的频率稳定性。该方法还可用于确定系统中作为平均时间函数的本征噪声。该方法易于计算和理解&#xff0c;是目前最流行的识别和量化惯性传感器数据中存在的不同噪声项的方法之一。该方法的结果与适用…

131. 分割回文串 - 力扣(LeetCode)

问题描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 输入示例 s "aab"输出示例 [["a","a","b"],["…

PS滤镜插件:Adobe Camera Raw 16 for Mac中文激活版

Adobe Camera Raw是Adobe公司开发的一款用于处理数码相机RAW格式文件的软件插件。它可以在Adobe Photoshop、Adobe Bridge和Adobe Lightroom等软件中使用&#xff0c;用于调整RAW文件的曝光、白平衡、对比度、色彩饱和度、锐化等参数&#xff0c;从而得到更好的图像质量。 软件…

STM32之模数转换器(ADC)

一、模数转换器介绍 1、模数转换器简介 为什么使用模拟转换器&#xff1f;&#xff1f; 因为MCU只能识别01010101的数字信号&#xff0c;而外部物理信号均为模拟信号&#xff0c;如声音、光、电等&#xff0c;所以为了让计算机能够处理外部物理的信息&#xff0c;必须要通过…

增加CO气体报警、氢气报警以及烟雾报警

标题&#xff1a;增加CO气体报警、氢气报警以及烟雾报警。 内容&#xff1a;通过ADC采集通道&#xff0c;实现传感器电压的采集&#xff0c;通过对电压进行判断是否报警&#xff0c;&#xff08;理论上应该可以计算出气体浓度&#xff0c;通过气体浓度来判断是否报警&#xff…

入门分布式事务,2PC 3PC

分布式事务 什么是分布式一致性 在分布式系统中&#xff0c;为了保证数据的高可用&#xff0c;通常&#xff0c;我们会将数据保留多个副本(replica)&#xff0c;这些副本会放置在不同的物理的机器上。为了对用户提供正确的增\删\改\查等语义&#xff0c;我们需要保证这些放置…

VRRP协议负载分担

VRRP流量负载分担 VRRP负载分担与VRRP主备备份的基本原理和报文协商过程都是相同的。同样对于每一个VRRP备份组,都包含一个Master设备和若干Backup设备。与主备备份方式不同点在于:负载分担方式需要建立多个VRRP备份组,各备份组的Master设备可以不同;同一台VRRP设备可以加…

骑砍战团MOD开发(39)-RTS塔防保卫卡拉迪亚大陆

骑砍1战团mod开发-RTS塔防保卫卡拉迪亚大陆_哔哩哔哩bilibili_骑马与砍杀https://www.bilibili.com/video/BV1hw411E7bP/骑砍战团MOD开发(28)-骑砍联盟之RTS大规模军团竞技-CSDN博客文章浏览阅读369次&#xff0c;点赞11次&#xff0c;收藏7次。【代码】骑砍战团MOD开发(28)-骑…

SpringCloud Alibaba 深入源码 - Nacos 分级存储模型、支撑百万服务注册压力、解决并发读写问题(CopyOnWrite)

目录 一、SpringCloudAlibaba 源码分析 1.1、SpringCloud & SpringCloudAlibaba 常用组件 1.2、Nacos的服务注册表结构是怎样的&#xff1f; 1.2.1、Nacos的分级存储模型&#xff08;理论层&#xff09; 1.2.2、Nacos 源码启动&#xff08;准备工作&#xff09; 1.2.…

java steam 的使用

说steam 前看下kotlin的一个写法如果用java怎么写 fun main() {// 创建一个列表val fruits listOf("Apple", "Banana", "Cherry", "Date", "Elderberry")// 使用 Sequence 进行过滤和映射操作val uppercaseFruitLengths …

《机器学习》客户流失判断-python实现

客户流失判断 题目赛题描述数据说明赛题来源-DataCastle 问题描述解题思路Python实现读取数据并初步了解导入宏包读取数据查看数据类型检查缺失值描述性统计分析 可视化分析用户流失分析特征分析任期年数与客户流失的关系&#xff1a;服务类属性分析特征相关性分析 数据预处理类…

二叉树的直径(LeetCode 543)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 给你一棵二叉树的根节点&#xff0c;返回该树的直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的长度由它们之间边数…

安卓平板局域网内远程控制工控机方法

安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上&#xff0c;将安卓平板连接上WiFi&#xff0c;如下图所示 下载NoMachine远程软件安装包&#xff0c;官网地址&#xff1a;https://www.nomachine.com/ 点击Download now按钮…

C++实战:类的包含编译模型

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;C普通类的包含编译模型1、创建普通类定义文件2、创建普通类实现文件3、创建主程序文件4、运行主程序&#xff0c;查看结果 &#xff08;二&#xff09;C模板类的包含编译模型1、创建模板类定义文件2、创建模板类实…

微前端框架篇一,了解qiankun

微前端框架篇一&#xff0c;了解qiankun ① 前置知识补充Ⅰ 什么是微前端&#xff1f;Ⅱ 什么是JS CSS沙箱&#xff1f;Ⅲ 什么是spa单页面应用&#xff1f;Ⅳ SystemJS 与 import-html-entryⅤ 现有的微前端方案 ② 了解single-spa 微前端框架③ 了解qiankun框架 ① 前置知识补…

[超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动+CUDA+cuDNN+Pytorch)--[1]安装显卡驱动

[写在前面] &#x1f447;&#x1f447;&#x1f447; 如果这篇博客写的还可以的话&#xff0c;希望各位好心的读者朋友们到最下面点击关注一下Franpper的公众号&#xff0c;或者也可以直接通过名字搜索&#xff1a;Franpper的知识铺。快要过年了&#xff0c;Franpper想制作一…

腾讯云代金券如何领取?详细领取教程来了!

随着云计算的快速发展&#xff0c;越来越多的用户意识到云服务的重要性。腾讯云作为国内领先的云服务提供商&#xff0c;为广大用户提供了丰富的云计算解决方案。为了吸引用户上云&#xff0c;腾讯云推出了代金券活动&#xff0c;让用户在购买云服务时可以享受到更多的优惠。 那…