Qt的MVC模型/视图编程(一)——理论知识

2023-11-11

一、为什么需要MVC模型/视图

MVC模型/视图架构是用于实现对大量数据的存储,处理及其显示。如下图所示:

没用MVC存储数据的是图片中的上半部分,用了MVC处理数据后的是图片的下半部分;

1:MVC模型/视图的作用

a、模型(数据)与视图(显示)相分离 ;

b、模型对外提供标准接口存取数据(不关心数据如何显示);

c、视图自定义数据的显示方式(不关心数据如何组织存储);

2:模型/视图的优点

a、视图模型分离, 提高代码重用性;

b、提高开发效率;

c、便于后期维护, 降低维护成本;

3:模型/视图的缺点

a、增加了系统结构和实现的复杂性。

b、视图与控制器间的过于紧密的连接。

二、MVC模型/视图的组成部分

        MVC(Model-View-Controller)是一种起源于Smalltalk的设计模式,经常用于建用户界面。MVC包含了3个组件:模型(Model)是应用对象,用来表示数据;视图(View)是模型的用户界面,用来显示数据;控制(Controller)定义了用户界面对用户输入的反应方式;

        将视图和控制两种组件结合起来,就形成了“模型/视图”架构。模型视图模式的直观理解如下图所示:

三、模型类

1、模型定义

        在模型/视图架构中,模型提供了一个标准的接口供视图和委托访问数据。 Qt中的模型类层次结构如下图所示:

2、模型中的索引

a、模型中的数据使用唯一的索引来访问 ;

b、模型索引是数据与视图分离的重要机制 ;

c、QModelIndex是Qt中的模型索引类型:包含具体数据的访问途径,包含一个指向模型的指针; d、模型索引通过行、列和父项(row、column和parent)访问数据 ;

e、模型索引的意义如下图所示:

3、模型中的数据角色

a、模型中的数据在视图中的用途(显示方式)可能不同 ;

b、模型必须为数据设置特定数据角色(数据属性);

c、数据角色用于提示视图数据的作用 ;

d、数据角色是不同视图以统一风格显示数据的标准;

四、视图类

        在MVC模型/视图体系结构中,视图从模型中获取数据项并呈现给用户。内容和表示的分离是通过使用QAbstractItemModel提供的标准模型接口,QAbstractItemView提供的标准视图接口,以及使用了模型索引提供了一种通用的方法来表示数据。 Qt中视图类的层次结构如下图所示:

 五、数据-窗口映射器

        数据-窗口映射器QDataWidgetMapper类是为数据模型和窗口部件提供了一个映射;这样就可以实现在窗口部件上显示和编辑一个模型中的一行数据。

        在实际项目中,经常用数据-窗口映射器QDataWidgetMapper类配合MVC模型/视图使用;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt的MVC模型/视图编程(一)——理论知识 的相关文章

  • 当我在组合框中选择一个项目时,如何防止 TextChanged 事件?

    我有一个TextChanged http msdn microsoft com en us library system windows forms control textchanged aspx我的事件ComboBox http msd
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 是否可以在 Qt Creator 中将 Qt 样式表与升级的小部件一起使用?

    我正在尝试使用 Qt 样式表对标准小部件进行一些重大的重新设计 因此 在为不同的小部件手动完成大部分工作之后 objectName选择器 我决定以某种方式对类似的小部件进行分组 例如我有多个QFrames其作用类似于内部表单中的标题 我希望
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • 华为OD机试真题-打印文件

    题目描述 有5台打印机打印文件 每台打印机有自己的待打印队列 因为打印的文件内容有轻重缓急之分 所以队列中的文件有1 10不同的优先级一 其中数字越大优先级越高 打印机会从自己的待打印队列中选择优先级最高的文件来打印 如果存在两个优先级一样
  • 复旦微魔方FM33FR0xx——FL库笔记-定义

    fm33fr0xx h的定义 一 时钟定义 define RCHF INITIAL CLOCK 8000000 内部RC高频震荡器 8M define RCMF CLOCK 4000000 内部RC 4M振荡器 define LPOSC C
  • 判断考生成绩等级(switch case语句练习)

    判断考生成绩等级 1 考生成绩控制在 0 100 2 成绩 90 100 优 成绩 80 90 良 成绩 70 80 可 成绩 60 70 一般 成绩 0 60 不及格 要求使用switch语句 不能使用if语句 class SwitchT
  • 华为OD机试 - 区间交叠问题(Java)

    题目描述 给定坐标轴上的一组线段 线段的起点和终点均为整数并且长度不小于1 请你从中找到最少数量的线段 这些线段可以覆盖柱所有线段 输入描述 第一行输入为所有线段的数量 不超过10000 后面每行表示一条线段 格式为 x y x和y分别表示
  • 爬虫取中间文本_10 个爬虫工程师必备的工具

    阅读文本大概需要 6 分钟 工欲善其事必先利其器的道理相信大家都懂 而作为经常要和各大网站做拉锯战的爬虫工程师们 则更需要利用利用好身边的一切法器 以便更快的攻破对方防线 今天我就以日常爬虫流程 给大家介绍十款工具 相信大家掌握之后 必定能
  • 用java有理数类包含加减乘除_用java具体代码实现分数(即有理数)四则运算

    用java具体代码实现分数 即有理数 四则运算 1 背景 Java老师布置了一个关于有理数运算的题目 因为参考书上有基本代码 所以自己主要是对书上代码做了一点优化 使其用户交互性更加友好以及代码封装性更强 2 说明 分数也称作有理数 是我们
  • 解空间

    目录 一 解空间 二 解空间的相对性 三 解空间结构 四 解空间结构的相对性 五 对象空间 六 对象空间和解空间的关系 1 对象空间等于解空间 2 解空间是对象空间的子空间 3 解空间是对象空间的子空间构成的集合 4 解空间是对象空间 或其
  • 求二叉树的深度/求二叉树的节点数

    1 求二叉树的深度 高度 思路 递归解法 1 如果二叉树为空 则树的深度为0 递归返回条件 2 如果二叉树不为空 二叉树深度 max 左子树节点个数 右子树节点的个数 1 代码如下 二叉树节点的数据结构 class treeNode pub
  • C语言,判断二维字符数组是否存在回文字符串 例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“};

    判断二维字符数组是否存在回文字符串 例如 char a 10 asd asa werew yuyu 提示存在回文字符串 回文字符串对称 思路 循环二维字符数组 判断每一个字符串是否是回文字符串 回文字符串使用单独函数 2 1 循环二维数组
  • C++14中返回类型推导的使用

    使用C 14中的auto返回类型 编译器将尝试自动推导 deduce 返回类型 namespace int xx 1 auto f return xx return type is int const auto f3 return xx r
  • 如何不冒昧的问妹子年龄又能清楚的知道她多大呢?Python来告诉你。

    前言 昨天 公司一个程序员过生日 一大帮子单身老爷们儿聚餐 可怜 所以大家呼朋唤友 有女朋友的带着闺蜜 朋友 好说歹说 准备一起聚聚 顺便给大家互相介绍 下 说不定 哎嘿有互相看对眼的呢 结果 人家小姐姐问你猜她多大 给程序员猜小姐姐年龄的
  • SSDA-YOLO:新的YOLOv5改进方法——用于跨域目标检测的半监督域自适应YOLO方法

    文章转载来源于自动驾驶之心 作者汽车人 域自适应目标检测 DAOD 旨在缓解跨域差异导致的传输性能下降 然而 大多数现有的DAOD方法由计算密集的两级检测器主导 这不是工业应用的首选 本文提出了一种新的基于半监督域自适应YOLO SSDA
  • Bailian3709 2进制转化为3进制【进制转换】

    题目链接 2进制转化为3进制 总时间限制 1000ms 内存限制 65536kB 描述 输入一个2进制的数 要求输出该2进制数的3进制表示 在3进制的表示中 只有0 1 2三种符号 输入 第1行是测试数据的组数n 后面跟着n行输入 每组测试
  • 彻底弄懂CommonJS和AMD/CMD!

    JS中的模块规范 CommonJS AMD CMD 如果你听过js模块化这个东西 那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯 我也听过 但之前也真的是听听而已 现在就看看吧 这些规范到底是啥东西 干嘛的 一 Commo
  • Ubuntu 搜狗输入法显示繁体,一直不显示简体

    1 问题 在ubuntu系统下 安装好sogou输入法之后 用了一段时间之后 输入拼音之后 老是出现繁体字 很烦 原因 可能误触了繁体简体开关 2 解决办法 按住shift 不放 同时 按下ctrl 和F键 即可 有些博客和评论说这种方式在
  • linux各种文件系统挂载总结

    mount语法 mount t 类型 o 挂接方式 源路径 目标路径 t 选项 iso9660 光盘或光盘镜像 msdos DOS fat16文件系统 vfat Windows 9x fat32文件系统 ntfs Windows NT nt
  • Redis核心知识点

    Redis面试精选 1 redis 简介 简单来说 redis 就是一个数据库 不过与传统https download csdn net download liyangxueit 12307486库不同的是 redis 的数据是存在内存中的
  • ++k与k++区别 和双目运算符结合

    最近在写代码时发现了这样一个错误 题目如下 链接 Hdu 1027 关键代码如下 int k 1 while next permutation s begin s end if k m 注意 问题就出在这里 for int i 0 i
  • C#编程和网络编程入门

    文章目录 一 用C 编写一个命令行 控制台程序 二 用C 编写一个简单的Form窗口程序 参考 一 用C 编写一个命令行 控制台程序 要求 用C 编写一个命令行 控制台hello world程序 实现如下功能 在屏幕上连续输出50行 hel
  • Qt的MVC模型/视图编程(一)——理论知识

    一 为什么需要MVC模型 视图 MVC模型 视图架构是用于实现对大量数据的存储 处理及其显示 如下图所示 没用MVC存储数据的是图片中的上半部分 用了MVC处理数据后的是图片的下半部分 1 MVC模型 视图的作用 a 模型 数据 与视图 显