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

未完待续。

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

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

相关文章

Leetcode—20.有效的括号【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—20.有效的括号 C实现代码 class Solution { public:bool isValid(string s) {stack<char> arr;int len s.size();if(len 1) {return false;}for(int i 0; i < len; i) {if(s[i] ( || s[i] [ || s[i] {)…

HDMI之编码篇

概述 HDMI 2.0b(含)以下版本,采用3个Channel方式输出。传输又分为3三种周期,视频数据,数据岛以及控制周期。视频传输采用8/10编码。数据岛采用4/10编码(TERC4)。控制周期采用2/10。编码都拓展成了10bits。 上图中,Pixel component(e.g.B)->D[7:0]表示视频数据周期…

深入了解JVM和垃圾回收算法

1.什么是JVM&#xff1f; JVM是Java虚拟机&#xff08;Java Virtual Machine&#xff09;的缩写&#xff0c;是Java程序运行的核心组件。JVM是一个虚拟的计算机&#xff0c;它提供了一个独立的运行环境&#xff0c;可以在不同的操作系统上运行Java程序。 2.如何判断可回收垃圾…

Git Commit 之道:规范化 Commit Message 写作指南

1 commit message 规范 commit message格式都包括三部分&#xff1a;Header&#xff0c;Body和Footer <type>(<scope>): <subject><body><footer>Header是必需的&#xff0c;Body和Footer则可以省略 1.1 Header Type&#xff08;必需&#xf…

JavaFX(其他控件02)(综合运用)

小技巧 图片控件的使用:Image/ImageViewnew ImageView(new Image(url,宽,高,true,true))--绝对路径: file:D:\\图片\\6.jpg --相对路径: src里面建了个文件夹 images/1.png滑块&#xff1a;Slider show(true) major(10) getValue() 保留2位小数&#xff1a;String.format(&q…

浙大恩特客户资源管理系统 fileupload.jsp 任意文件上传

一、漏洞描述 杭州恩软信息技术有限公司&#xff08;浙大恩特&#xff09;提供外贸管理软件、外贸客户管理软件等外贸软件&#xff0c;是一家专注于外贸客户资源管理及订单管理产品及服务的综合性公司。 浙大恩特客户资源管理系统中的fileupload.jsp接口存在安全漏洞&#xf…

VS Code画流程图:draw.io插件

文章目录 简介快捷键 简介 Draw.io是著名的流程图绘制软件&#xff0c;开源免费&#xff0c;对标Visio&#xff0c;用过的都说好。而且除了提供常规的桌面软件之外&#xff0c;直接访问draw.io就可以在线使用&#xff0c;堪称百分之百跨平台&#xff0c;便捷性直接拉满。 那么…

【python后端】- 初识Django框架

Django入门 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大家一起学习成长&#xff01; 文章目录 Django入门…

SpringBoot的Data开发篇:整合JDBC、整合MybatisMP,YAML文件加密的实现,数据项目监控平台的使用和实现

SpringBoot整合JDBC 实现步骤&#xff1a; 导pom文件坐标 除springboot启动器和test坐标外&#xff0c;还需要导入spring jdbc和mysql的坐标 <dependencies><!--Spring JDBC--><dependency><groupId>org.springframework.boot</groupId><art…

【fast2021论文导读】 Learning Cache Replacement with Cacheus

文章:Learning Cache Replacement with Cacheus 导读摘要: 机器学习的最新进展为解决计算系统中的经典问题开辟了新的、有吸引力的方法。对于存储系统,缓存替换是一个这样的问题,因为它对性能有巨大的影响。 本文第一个贡献,确定了与缓存相关的特征,特别是,四种工作负载…

JSP运行环境搭建

将安装JSP引擎的计算机称作一个支持JSP的Web服务器。这个服务器负责运行JSP&#xff0c;并将运行结果返回给用户。 JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分之一。一个简单Web应用程序可能只有一个JSP页面,而一个复杂的Web应用程序可能由许多JSP…

CnosDB 狂欢!全面支持 Helm 部署,轻松搞定你的分布式时序数据库!

大家好&#xff01;今天有个热辣新闻要和大家分享——CnosDB 狂欢时刻来啦&#xff0c;全面支持 Helm 部署&#xff01;如果你是物联网、工业互联网、车联网或者IT运维的粉丝&#xff0c;那你绝对不能错过这个重磅消息&#xff01; CnosDB Helm Chart 究竟是啥&#xff1f; 别…

网络通讯基础

Socket Socket是应用层与TCP/IP协议簇通信的中间软件抽象层&#xff0c;它是一组接口。Socket通常用于实现客户端和服务器之间的通信。它允许客户端应用程序与服务器应用程序建立连接&#xff0c;并通过网络传输数据。 Socket包含了网络通讯必须的5种信息 Socket例子 { 协议: …

计算机毕业设计 基于Vue篮球联盟管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

vue:实现顶部消息横向滚动通知

前言 最近有个需求&#xff0c;是在系统顶部展示一个横向滚动的消息通知。需求很简单&#xff0c;就是消息内容从右往左一直滚动。 效果如下&#xff1a; 因为我的需求很简单&#xff0c;功能就这样。如果有什么其他需求&#xff0c;可以再继续修改。 代码 使用 <noti…

《深入理解计算机系统》书籍学习笔记 - 第二课 - 位,字节和整型

Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型 文章目录 Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型Byte 字节位操作布尔代数集合的表现形式和操作C语言的逻辑操作 位移操作整型数值范围无符号与有符号数值无符号与有符号在C中 拓展和截断拓…

2023年【电工(初级)】考试内容及电工(初级)复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;考试内容是安全生产模拟考试一点通总题库中生成的一套电工&#xff08;初级&#xff09;复审模拟考试&#xff0c;安全生产模拟考试一点通上电工&#xff08;初级&#xff09;作业手…

C++语言的广泛应用领域

目录 1. 系统级编程 2. 游戏开发 3. 嵌入式系统 4. 大数据处理 5. 金融和量化分析 6. 人工智能和机器学习 7. 网络和通信 结语 C是一种多范式编程语言&#xff0c;具有高性能、中级抽象能力和面向对象的特性。由Bjarne Stroustrup于1979年首次设计并实现&#xff0c;C在…

电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计

电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计 6、电路综合-基于简化实频的SRFT微带线切比雪夫低通滤波器设计中介绍了使用微带线进行切比雪夫滤波器的设计方法&#xff0c;在此对集总参数的切比雪夫响应进行分析。 SRFT集总参数切比雪夫低通滤波器综合不再需要…

SpringBootWeb案例——Tlias智能学习辅助系统(3)——登录校验

前一节已经实现了部门管理、员工管理的基本功能。但并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台&#xff0c;这节来实现登录认证。 目录 登录功能登录校验(重点)会话技术会话跟踪方案一 Cookie&#xff08;客户端会话跟踪技术&#xff09;会话跟踪方案二…