QT中的模型与视图是一种架构,一种框架,与MVC框架类似,他目的是使得数据与界面相互分离

首先介绍MVC:

MVC作为一种可视化方法:三个字母分别代表(model)模型-(view)视图-(controller)控制器

模型代表的是数据集合,其对数据的查看以及获取还有任何存储的改变负责

视图代表的是面向用户的数据,就是用户所能看到的数据

控制器则是用户和视图之间的媒介,他将用户的操作转换为浏览或者编辑数据的请求.比如要改变某个视图框中的数据,那么就需要这个控制器,根据用户的需要,改变数据再将数据由视图到模型.

在QT中没有控制器, 只有模型和视图,取代控制器的则是委托 在下图中也可以看出委托的通过编辑也可将数据的改变反馈给模型.模型再相应的和数据做出交互,在图中也可以看出视图从模型中读取数据.

还有一种好处就是我们需要修改底层存储的时候,在这个框架下面不需要动视图,只需要修改模型就可以,视图还可以正常的工作,视图也不能简单的理解为显示数据的,比如说在表格视图中,那么网格线的绘制,以及滚轮的绘制,数据项的选择都是视图的工作. 我的理解为显示的部分,只要是给人看到的,就是视图的工作.

在QT中模型视图架构我的理解是 模型可以获取我们源数据集合中的数据,这个源头就比较多了比如从数据库中,或者是List中,又或者是String中,总之他先将数据从这些源头中拿出来.然后再和需要显示的视图绑定,他可以绑定多个视图,也就是说在多个显示数据的视图中都可以用一个模型.

模型的结构

在QT中,所有的数据存储都被模型最后转换为一种层次结构(就是一种树形的结构).如此的话,视图在访问数据的时候那么比较规范化的.当数据是列表(list)或表格(tab)结构的时候,则可以把其看作是只含有顶层节点,不含任何子节点的树形结构,如下图所示.

模型的索引

索引实现了QT的数据和显示的分离,只有模型知道如何取源数据中的数据,视图和委托通过索引来访问数据项.索引如何拿到,是需要从视图中去拿到的,因为做什么操作是用户说了算的.比如在某一行中去添加某一个数据,拿到这一行.是从视图中去拿到的

(1) 树形结构

获取数据项A的模型索引,A的父索引由一个无效模型索引指定。
QModelIndex iA = model.index(0,0, QModelIndex());
//获取数据项B的模型索引,B位于父索引iA的第1行第1列位置。
QModelIndex iB = model.index(1,1, iA);
(2) 表格结构
//获取数据项B的模型索引,B是顶级数据项,因此其父索引是一个无效索引。
QModelIndex iB = model.index(1,2, QModelIndex());
(3) 列表结构
//获取数据项B的模型索引,B是顶级数据项,因此其父索引是一个无效索引。
QModelIndex iB = model.index(1,0, QModelIndex());

现在总结以下如何通过模型视图架构获取数据

1.设置相应的模型/视图结构 比如 QStringListModel QListView

2.视图与模型绑定    listView->setModel(model);

3.获取索引,做出你相应的操作.

具体代码解释:

    QStringList data;                                   //设置数据源data << "Letter A" << "Letter B" <<"Letter C";// QStrinrListModel            model = new QStringListModel(this);                //设置模型结构model->setStringList(data);                        //给模型添加数据listView = new QListView(this);                    //设置视图结构listView->setModel(model);                         //视图模型相互绑定

获取索引(此时希望数据发生什么操作,是需要我们人为进行设置的)

在这个例子中我们想要在 Letter C 之前添加某一个数据,点击了insert按钮那么,此时我们肯定是需要一个槽函数的,在槽函数中我们首先要拿到索引,拿到索引之后向下对模型交互,然后再向上对视图交互. 代码如下:

QModelIndex currIndex = listView->currentIndex();   //在视图中获得当前索引

model->insertRows(currIndex.row(),1);    //往前一行插入元素 在这个上面插入几个元素

model->setData(currIndex,text);  //model利用索引增加数据

listView->edit(currIndex);//更新视图.

qDebug()<<model->stringList();//打印模型数据

第一节学习完结

Qt学习(一)模型与视图相关推荐

  1. QT学习:模型/视图基本概念

    Qt的模型/视图结构分为三部分:模型(Model).视图(View)和代理(Delegate).其中,模型与数据源通信,并为其他部件提供接口:而视图从模型中获得用来引用数据条目的模型索引(Model ...

  2. QT学习笔记14(Qt模型视图结构)

    一.基础知识 1.MVC设计模式:是一种与用户界面相关的设计模式,通过此模式,可以有效的分离数据和用户界面. MVC包括三个要素: 表示数据的模型(Model):应用程序的对象 表示用户界面的视图(V ...

  3. Qt模型、视图解读之视图

    2.视图类 视图的概述: 视图包含了模型中的数据项,并将它们呈现给用户. 视图通常管理从模型获取数据的整体布局,它们可以自己渲染独立的数据项,也可以使用委托来处理渲染和编辑. 视图的特性: 视图还可以 ...

  4. Qt中的模型视图设计模式

    文章目录 1 初探Qt中的模型视图设计模式 2 模型视图中的索引 3 模型中的数据组织方式初探 1 初探Qt中的模型视图设计模式 模型视图设计模式的核心思想: 模型(数据)与视图(显示)相分离. 模型 ...

  5. Qt5开发学习之模型/视图结构(十)

    Qt MVC概述 MVC是一种与用户界面相关的设计模式.通过使用此模型,可以有效地分离数据和用户界面.MVC设计模式包含三要素:表示数据的模型(Model).表示用户界面的视图(View)和定义了用户 ...

  6. Qt学习笔记之数据库

    一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...

  7. Qt学习之路_12(简易数据管理系统)

    原文地址为: Qt学习之路_12(简易数据管理系统) 前言 最近从大陆来到台湾,之间杂事很多,挤不出时间来更新博客- 这次主要是通过做一个简易的数据库管理系统,来学习在Qt中对数据库,xml,界面的各 ...

  8. QT学习之路2 学习笔记

    QT学习之路2 学习笔记 1.Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个&quo ...

  9. 《Qt 学习之路 2》

    Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...

最新文章

  1. Delphi中判断控件的详细类型
  2. 2.1.3 操作系统之原语实现对进程的控制
  3. 联邦学习:保护用户数据隐私
  4. windows下如何下载并安装Python 3.5.
  5. 三菱a系列motion软体_三菱M70A/64SM重要功能比较
  6. Flexible 弹性盒子模型之flex
  7. 图书ISBN号码检验(洛谷P1055题题解,Java语言描述)
  8. 标记区域 Region
  9. C语言学习有感day01
  10. 使用uniapp绘制一个折线图(uCharts)
  11. 梦龙物联卡冻结_四川梦龙科技物联卡哪个划算
  12. pol点获取及火星坐标系转换
  13. Eclipse for Android —— ADT Bundle
  14. 极客的浪漫「GitHub 热点速览 v.22.41」
  15. Linux CentOS-8.4下载与安装
  16. 软件测试中的“银行信贷项目“讲解
  17. cf 429 B. Godsend
  18. 区块链为什么这么火热?
  19. maven命令行创建web项目报错:java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils...
  20. 自定义View - 仿酷狗音乐主页面侧滑效果

热门文章

  1. WPF:MouseDown、MouseUP事件,鼠标按下不起作用
  2. python IO编程
  3. 【Linux】Linux 下socket 编程
  4. 亲身试验之后,我差点被微博上的兼职广告骗到三和
  5. CodeMirror 格式化内容和内容选择CodeMirror 官方文档
  6. C++ 2.吃雪糕吗
  7. 使用SSH方式实现Git远程连接GitHub
  8. 《卓有成效的管理者》笔记,第一章 卓有成效是可以学会的
  9. 心蓝12306订票助手-自己动手抢火车票
  10. 循序渐进理解RTFM算法