【Qt之Model/View】编程

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.mzph.cn/news/139847.shtml

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

相关文章

“富婆”通讯录——让你少奋斗50年

文章目录 一、项目需求分析二、通讯录各功能实现思路及代码准备工作2.1、打印一个菜单,提供用户选择功能2.2、添加联系人信息2.3、删除联系人信息2.4、查询联系人信息2.5、修改联系人信息2.6、显示所有联系人信息2.7、对所有联系人信息进行排序整理2.8、删除所有联系…

基于redis实现分布式锁

文章目录 基于redis实现分布式锁基本实现防死锁防误删高并发场景下无法保证原子性使用lua保证删除原子性 把redis锁封装成方法 基于redis实现分布式锁 基本实现 借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同时有多个客…

C++自动注册的工厂与--whole-archive

上篇文章《静态库和链接选项--whole-archive》提到--whole-archive的一个应用场景:C自动注册的工厂,这篇文章来填坑。 预备知识 我们经常用工厂类或工厂方法统一管理资源,实现资源的创建和使用之间的解耦,调用者无需关心资源创建的…

基于springboot乐器视频学习网站设计与实现(源码齐全可用)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍…

卡码网57. 爬楼梯

题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 输入描述 输入共一行&#xff0c;包含两个正整数&#xff0c;分别表示n, …

国际阿里云:Linux实例负载高问题排查和异常处理!!!

问题描述 在您使用ECS实例过程中&#xff0c;可能会遇到实例系统负载较高的情况&#xff0c;负载过高&#xff0c;可能会引发一系列异常问题&#xff0c;简单说您如下&#xff1a; CPU使用率或负载过高&#xff1a;一般来说&#xff0c;当CPU使用率≥80%时&#xff0c;定义为C…

PROFINET和UDP、MODBUS-RTU通信速度对比实验

这篇博客我们介绍PROFINET 和MODBUS-RTU通信实验时的数据刷新速度,以及这种速度不同对控制系统带来的挑战都有哪些,在介绍这篇对比实验之前大家可以参考下面的文章链接: S7-1200PLC和SMART PLC的PN智能从站通信 S7-200 SMART 和 S7-1200PLC进行PROFINET IO通信-CSDN博客文…

【Redis系列】Redis的核心命令(上)

哈喽&#xff0c;大家好&#xff0c;我是小浪。那么上篇博客教会了大家如何在Linux上安装Redis&#xff0c;那么本篇博客就要正式开始学习Redis啦&#xff0c;跟着俺的随笔往下看~ 1、启动Redis 那么如何启动Redis呢&#xff1f;最常用的是以下这个命令&#xff1a; redis-cl…

jedis、lettuce与redis交互分析

概念梳理&#xff1a; redis是缓存服务器&#xff0c;jedis、lettuce都是Java语言下的redis客户端&#xff0c;用于与redis服务器进行交互。springboot项目中一般使用的是spring data redis&#xff0c;spring data redis依赖与jedis或lettuce&#xff0c;可以进行配置&#x…

物联网AI MicroPython学习之语法 network网络配置模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; network介绍 模块功能&#xff1a; 用于管理Wi-Fi和以太网的网络模块参考用法&#xff1a; import network import time nic network.WLAN(network.STA_IF) nic.active(True) if not nic.isconnected():…

要找事做,我真怕被闲死

要找事做&#xff0c;我真怕被闲死 | 昨晚睡足了5个多小时&#xff0c;元气开始恢复&#xff0c;今晨6点钟醒来&#xff0c;如厕后无睡意&#xff0c;便窝在被子里闭目养神&#xff0c;同时想心事。 7点钟翻身起床穿衣洗刷后&#xff0c;烧瓶开水泡杯浓茶&#xff0c;打开电脑…

无人机航迹规划:五种最新智能优化算法(GRO、SWO、COA、LSO、KOA)求解无人机路径规划MATLAB

一、五种算法&#xff08;GRO、SWO、COA、LSO、KOA&#xff09;简介 1、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。VRPTW&am…

idea配置tomcat参数,防止nvarchar保存韩文、俄文、日文等乱码

描述下我的场景&#xff1a; 数据库服务器在远程机器上&#xff0c;数据库使用的Oracle&#xff0c;字符集是ZHS16GBK&#xff0c;但保存韩文、俄文、日文等字段A的数据类型是nvarchar(120)&#xff0c;而nvarchar使用的是Unicode 编码&#xff0c;有点乱。。 遇到的问题&…

Thinkphp8 - 连接多个数据库

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

Java图像编程之:Graphics

一、概念介绍 1、Java图像编程的核心类 Java图像编程的核心类包括&#xff1a; BufferedImage&#xff1a;用于表示图像的类&#xff0c;可以进行像素级的操作。Image&#xff1a;表示图像的抽象类&#xff0c;是所有图像类的基类。ImageIcon&#xff1a;用于显示图像的类&a…

3、FFmpeg基础

1、FFmpeg 介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库。 2、FFmpeg 组成 - libavformat:用于各种音视频[封装…

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

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

tomcat+idea--如何在idea上发布项目

对应于idea2022以后的版本 &#xff08;一&#xff09;如何配置idea上的tomcat&#xff1f; 1、新建一个项目&#xff0c;左上角File&#xff0c;new&#xff0c;project&#xff0c;新建后就和普通的java项目一样。 2、然后点击项目名&#xff0c;右键选择“Add framework s…

JUL日志

文章目录 JUL日志JUL日志讲解Properties配置文件编写日志配置文件Lombok快速开启日志Mybatis日志系统 JUL日志 如果使用System.out.println来打印信息&#xff0c;项目中存在大量的控制台输出语句&#xff0c;会显得很凌乱&#xff0c;而且日志的粒度是不够细的&#xff0c;假…