当前位置: 首页 > news >正文

Qt 中model/View 架构 详解,以及案例实现相薄功能

model/View 架构

导读

​ 我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改的地方写回,然后刷新组件进行显示。这个思路很简单,也很清晰,但是对于大型程序,这种设计就显得苍白无力。比如,在一个大型系统中,你的数据可能很大,全部存入一个组件的数据对象中,效率会很低,并且这样的设计也很难在不同组件之间共享数据。如果你要几个组件共享一个数据对象,要么你就要用存取函数公开这个数据对象,要么你就必须把这个数据对象放进不同的组件分别进行维护。

​ Smalltalk 语言发明了一种崭新的实现,用来解决这个问题,这就是著名的 MVC 模型。对这个模型无需多言。MVC 是 Model-View-Controller 的简写,即模型-视图-控制器。在 MVC 中,模型负责获取需要显示的数据,并且存储这些数据的修改。每种数据类型都有它自己对应的模型,但是这些模型提供一个相同的 API,用于隐藏内部实现。视图用于将模型数据显示给用户。对于数量很大的数据,或许只显示一小部分,这样就能很好的提高性能。控制器是模型和视图之间的媒介,将用户的动作解析成对数据的操作,比如查找数据或者修改数据,然后转发给模型执行,最后再将模型中需要被显示的数据直接转发给视图进行显示。MVC 的核心思想是分层,不同的层应用不同的功能。

Model/View 理论结构图

请添加图片描述

​ 如上图所示,模型与数据源进行交互,为框架中其它组件提供接口。这种交互的本质在于数据源的类型以及模型的实现方式。视图从模型获取模型索引,这种索引就是数据项的引用。通过将这个模型索引反向传给模型,视图又可以从数据源获取数据。在标准视图中,委托渲染数据项;在需要编辑数据时,委托使用直接模型索引直接与模型进行交互。

​ 总的来说,model/view 架构将传统的 MV 模型分为三部分:模型、视图和委托。每一个组件都由一个抽象类定义,这个抽象类提供了基本的公共接口以及一些默认实现。模型、视图和委托则使用信号槽进行交互:

  • 来自模型的信号通知视图,其底层维护的数据发生了改变。
  • 来自视图的信号提供了有关用户与界面进行交互的信息。
  • 来自委托的信号在用户编辑数据项时使用,用于告知模型和视图编辑器的状态。

Qt 中Model

QAbstractItemModel
QAbstractListModel
QStringListModel
QAbstractProxyModel
QSortFilterProxyModel
QAbstractTableModel
QSqlQueryModel
QSqlTableModel
QSqkRelationalTableModel

相关文章:

  • Kubeadm 高可用集群部署
  • UDP 协议
  • 01-Nacos安装和下载
  • CPU就绪情况及其对虚拟机性能的影响
  • Spring底层原理(四)
  • 【esp32]VSCode-SPI控制OLED
  • 使用 Curl 和 DomCrawler 下载抖音视频链接并存储到指定文件夹
  • 定时器PWM输出
  • uniapp 模仿 Android的Menu菜单栏
  • 开源软件:释放创新的力量,改变数字世界的游戏规则
  • 基于springboot实现学生就业管理系统项目【项目源码+论文说明】计算机毕业设计
  • 绝缘栅双极型晶体管igbt短路如何用自动化软件进行测试?
  • WPS文件恢复怎么做?记得掌握这5个方法!
  • 英飞凌TC3xx-Overlay
  • 多模态论文学习之ALBEF(Align BEfore Fusing)
  • .pyc 想到的一些问题
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【刷算法】求1+2+3+...+n
  • C学习-枚举(九)
  • golang中接口赋值与方法集
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript 基本功--面试宝典
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • mac修复ab及siege安装
  • Redis字符串类型内部编码剖析
  • scala基础语法(二)
  • tab.js分享及浏览器兼容性问题汇总
  • Vue 2.3、2.4 知识点小结
  • vue中实现单选
  • 从0到1:PostCSS 插件开发最佳实践
  • 浮动相关
  • 后端_ThinkPHP5
  • 开源地图数据可视化库——mapnik
  • 浏览器缓存机制分析
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端面试题总结
  • 入门到放弃node系列之Hello Word篇
  • 深度学习在携程攻略社区的应用
  • 使用 Docker 部署 Spring Boot项目
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 线上 python http server profile 实践
  • 一天一个设计模式之JS实现——适配器模式
  • 硬币翻转问题,区间操作
  • ![CDATA[ ]] 是什么东东
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #AngularJS#$sce.trustAsResourceUrl
  • #Linux(权限管理)
  • #pragma once
  • #微信小程序(布局、渲染层基础知识)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (02)Hive SQL编译成MapReduce任务的过程
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (c语言)strcpy函数用法
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (三十五)大数据实战——Superset可视化平台搭建