Qt - 模型视图

news2024/11/26 1:43:16

模型/视图

概念

模型/视图结构将数据存储和界面展示分离,分别用不同的类实现

  • 模型:存储数据
  • 视图:界面上的视图组件显示模型中的数据;在视图组件里修改的数据会被自动保存在模型中

请添加图片描述

  • 源数据

内存中的一个字符串列表
磁盘文件系统结构
数据库的一个数据表
sql查询结果

  • 视图(视图组件)

视图从模型获得数据然后将其显示在界面上 QListView QTreeView QTableView

  • 模型(数据模型)

模型与源数据通信,并为视图自检提供数据接口
模型从源数据提取需要的数据,用于视图组件进行显示和编辑
模型类 QStringListModel字符串列表模型类 QSqlTableModel数据库中数据表的模型类

  • 代理

在视图与模型之间交互操作时提供的临时编辑器
模型向视图提供数据是单向的,一般仅用于显示,当需要在视图上编辑数据时,代理会为编辑数据提供一个编辑器,这个编辑器获取模型的数据、接受用户编辑的数据后又将其提交给模型
(QTableView组件上双击一个单元格来编辑数据时,在单元格里就会出现一个QLineEdit组件,这个编辑框就是代理提供的临时编辑器)

  • 通讯方式

模型、视图、代理使用信号和槽进行通信
当源数据发生变化时,模型发射信号通知视图组件
当用户在界面上操作数据时,视图组件发射信号表示操作信息
在编辑数据时,代理会发射信号告知模型和视图组件编辑器的状态

模型

模型数据来源:

  • 内存数据(字符串列表等)
  • 二维表格型数据
  • 数据库中的数据表
    其他类、文件、数据库或任何数据源

一种模型数据可以用不同的视图组件来显示数据
界面与原始数据的交互是通过模型来完成的

QAbstractItemModel

所有基于项的模型类都是继承自QAbstractItemModel类
这个类定义了视图组件和代理存取数据的接口
模型只是在内存中临时存储数据
该抽象模型类不能直接用于创建实例对象,常用的模型类如下

// 继承关系
QAbstractItemModel
- QFileSystemModel                          // 用于表示计算机文件系统的模型类
- QAbstractListModel - QStringListModel     // 用于表示字符串列表数据的模型类
- QStandardItemModel                        // 标准的基于项的模型类,每个项是一个QStandardItem对象 
- QAbstractTableModel 
    - QSqlQueryModel                        // 用于表述数据库sql查询结果 
    - QSqlTableModel                        // 用于表述数据库的一个数据表的模型类

视图

  • QListView 用于显示单列的列表数据,一维数据
  • QTreeView 用于显示树状结构数据,树状结构数据
  • QTableView 用于显示表格数据,二维表格数据
  • QColumnView 用于多个QListView 显示树状结构数据
  • QUndoView …

xxxView / xxxWidget

xxxView 用于模型/视图结构,每一种视图组件需要相应的一种模型用于存储数据
xxxWidget是xxxView的子类,直接使用item来存储数据,称为视图类的便利类

视图组件的数据来源于模型
视图组件不存储模型
便利类为组件的每个节点或单元格创建一个项,用项存储数据 (QTableWidget这个便利类,表格的每个单元格关联一个QTableWidgetItem对象)
便利类没有模型,实际上是用项的方式代替模型的功能,将界面与数据进行绑定

便利类缺乏对大型数据源进行灵活处理的能力,只适用于小型数据的显示和编辑
视图组件则会根据模型的数据内容自动显示,有助于减少编程工作量,使用更灵活

// 继承关系
QAbstractItemView
- QListView
    - QUndoView 
    - QListWidget
- QTreeView
    - QTreeWidget
- QTableView
    - QTableWidget
- QColumnView

视图与模型

调用视图类的setModel()函数为视图组件设置一个模型,模型的数据就可以显示在视图组件上了
在视图组件上修改数据后,数据可以自动保存到模型中

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

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

相关文章

【二叉树part08】| 669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 🎈LeetCode669. 修剪二叉搜索树 🎈LeetCode108.将有序数组转换为二叉搜索树 🎈LeetCode538.把二叉搜索树转换为累加树 🎈LeetCode669. 修剪二叉搜索树 链接:669.修剪二叉搜索树 给你二叉搜索树的根节点 root…

用于 3D 建模和渲染应该选择怎么样的配置?

选择合适的机器可能会使决定变得困难。在分析图像时,它还需要一定数量的核心和线程,这绝对是一个怪物。渲染一般是使用GPU或者CPU来进行,从而产生渲染效果。 3D 建模是一种用于构建和评估实际物理对象的虚拟 3D 模型的应用程序。该技术应用于…

Mvc进阶(下)

Mvc进阶(下) 1.前言2.上次代码弊端1.利用xml建模反射优化1.XMl文件2.对xml建模 3.修改中央控制器 3.再优化1.先优化Action子控制器4.优化传值问题 4.总结 1.前言 虽然前面文章深入解析Java自定义MVC框架的原理与实现讲述了Mvc框架,但是那只能…

suse ha for sap scale-up性能优化场景安装配置

1. 安装SUSE操作系统 在官网下载SUSE Linux Enterprise Server for SAP Applications安装介质,在安装操作系统过程中,选择SUSE Linux Enterprise Server for SAP Applications操作系统。 在软件选择界面,根据需要选择SAP HANA Server Base…

oracle connect by很强,但是要慎用,不然有你哭的时候

前言: 第四次工业革命,带来了科技的巨大变更,同时带来了很多半结构化数据,很多数据会做成集合、JSON的形式存储到数据库中,通过ETL工具我们将这些数据抽取到数仓里面,我们怎么进行分析呢?这些数据类似这样的…

centos7安装git及maven

安装git 直接使用yum安装,指令如下: yum install git然后执行如下指令判断是否安装完成: git --version紧接着需要维护git的用户名及邮箱等信息 git config --global user.name "zzy" git config --global user.email "ex…

JS知识点汇总(十四)--事件循环

1. 对事件循环的理解 JavaScript 在设计之初便是单线程,即指程序运行时,只有一个线程存在,同一时间只能做一件事 JavaScript 初期作为一门浏览器脚本语言,通常用于操作 DOM ,如果是多线程,一个线程进行了删…

QT学习笔记:调整控件大小和位置

前面的文章,我讲了怎么用layout去布局。但布局做完后,发现界面有点怪。比如,最低下的“清除”按钮这么大,“消息体”这个label没有位于中间等。下面,我就来讲下怎么把界面继续优化。 1、调整“清除”按钮大小和位置 …

第八步:STM32F4 EXTI

1.0 外部中断概述 STM32F4的每个IO都可以作为外部中断输入。 STM32F4的中断控制器支持22个外部中断/事件请求: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18&#xff1…

Kubernetes(k8s)实战:Kubernetes(k8s)部署Springboot项目

文章目录 一、练手:k8s部署部署wordpressmysql1、创建wordpress命名空间2、创建mysql数据库3、创建wordpress应用4、小结 二、实战:部署自己的springboot项目1、准备一个springboot项目2、使用docker打成镜像3、使用k8s部署springboot 三、实战&#xff…

pycharm配置虚拟环境

pychram配置虚拟环境,然后使终端在该目录下 win键r 输入cmd, 进入dos命令。使用conda create -n cleanRobot python3.7 创建cleanRobot虚拟环境。 输入: conda activate cleanRobot 进行虚拟环境激活。 我们在安装的anaconda的目录下可以看到刚刚建…

Java批量操作Excel文件实践

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 | 问题背景 在操作Excel的场景中,通常会有一些针对Excel的批量操作&…

基于matlab使用Grad-CAM探索语义分割网络(附源码)

一、前言 此示例演示如何使用 Grad-CAM 探索预训练语义分割网络的预测。 语义分割网络对图像中的每个像素进行分类,从而生成按类分割的图像。您可以使用深度学习可视化技术 Grad-CAM 来查看图像的哪些区域对像素分类决策很重要。 二、下载预训练网络 从剑桥大学…

基于Java工贸学生信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

vscode多主题色功能实现机制

vscode的页面分为两部分,一部分是插件提供,一部分是主体。那么vscode在多主题实现上就要考虑把这两部分结合起来管理,相对来说要比单纯的网页实现多主题功能要复杂一些。 主体部分实现 我们先看下vscode主体部分样式是如何画出来了 registe…

Spring系列2 -- Spring的创建和使用

Spring 就是⼀个包含了众多工具方法的 IOC容器。既然是容器那么它就具备两个最基本的功能: 将对象存储到容器(Spring)中;从容器中将对象取出来。 在Java中对象也叫做Bean,后续我们就把对象称之为Bean; 目录…

数据结构--二叉树的定义和基本术语

数据结构–二叉树的定义和基本术语 二叉树的基本概念 二叉树是 n ( n ≥ 0 ) n (n\ge0) n(n≥0)个结点的有限集合: ①或者为 空二叉树 \color{red}空二叉树 空二叉树,即n 0。 ②或者由一个 根结点 \color{red}根结点 根结点和两…

ModaHub魔搭社区:腾讯发布的向量数据库Tencent Cloud VectorDB有哪些核心能力?

腾讯发布的向量数据库有哪些核心能力? 腾讯云刚刚发布的向量数据库Tencent Cloud VectorDB主要具备以下能力: 高性能向量存储、检索:腾讯云向量数据库具备高性能的向量存储和检索能力,单索引能够轻松支持10亿级别的向量规模。在…

十二、flex练习

需求&#xff1a;做出下面的样式 代码实现&#xff1a; <body><ul class"nav"><li><a href"#">HTML/CSS</a></li><li><a href"#">Browser Side</a></li><li><a href&q…

【Hello mysql】 数据库库操作

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍数据库的库操作 库的操作 创建数据库创建数据库案例字符集和校验规则查看系统默认字符集和校验规则查看数据库支持的字符集和校验规则 校验规则对于数据库的影响操纵数据库查看数据库显示创建语句修改数据库数据库删除…