Introduction to Model/View Programming 
     QT4 介绍了一系列新的 Item View 类,这些类使用Model/View结构来管理数据和数据如何呈现给用户。这种结构使程序员更加灵活的开发和定制呈现数据界面,Model/View结构提供标准的Model接口让各种数据资源都能够被存在的Item View使用。
 
The model/view architecture
      MVC是一种源于 smalltalk的设计模式,经常用来构建应用程序界面。
      MVC有3个对象构成。 Model是 Application object,  View是screen presentation,Controller 定义界面对用户输入的反应(各种事件)。在MVC之前,程序员把所有的设计都放在一个类中。MVC使得代码更灵活和数据重用。
 
     如果View和Controller对象结合起来,结果就是Mode/View结构。这种方式仍然分离了提供给用户的数据,但是提供了一个简单的框架,基于一样的标准。这种分离使得能在不同的View中展示同一个数据,实现新的View类,而不用改变底层的数据结构。为了灵活处理用户输入,我们介绍Delegate的概念,在框架中有Delegate的好处是它(Delegate)能够处理数据渲染(数据如何显示出来)和定制数据(数据能够被编辑处理,达到定制的效果)。Delegate数据渲染使用paint()方法 。创建Editor for data 使用createEditor()方法。
     
     Model类,数据之间的通讯(数据的获得 改变等方法),为Model/View结构中其他组件提供接口(例如notifyListener()方法,告知其他组件数据已经被改变)。通讯的性质取决于数据的类型和Model的实现方式。Model中把数据按照角色分类(enum Qt::ItemDateRole),Qt::DisplayRole仅仅就是以Text的方式显示数据,其他例如Qt::FontRole决定字体。所以Model通过Qt::ItemDateRole 机制能够影响应用程序的外观。
 
     View类从Model类中获得Model Index,Model Index就是数据项的引用。通过提供Model Index给Model,View类能够从数据源中获得数据。在标准的View类中,Delegate用来渲染数据,当一个Item被编辑时,Delegate通过Model Index直接和Model 通讯。
 
     总的来说Model/View类能被分成3组:Models、View、Delegates。这些组件都被定义在抽象类之中,抽象类提供公有的接口,某些情况下,默认实现一些函数。抽象类意味着子类根据需要来implement这个抽象类。
 
     Model、View、Delegate之间的相互通讯使用信号和槽机制。
     Model中的信号告诉View数据源中的某数据被改变
     View中的信号和用户交互信息有关(如何展示这个Item)
     Delegate中的信号,在Editing中发射,告诉Model和View editor的状态。
 
 
     
     Models
   所有的Item Model类都是基于QAbstractItemModel类,这个类定义了接口,View和Delegate如何获得数据。数据本身并没有存储在Model类中,数据能够存储在单独类的数据结构中、文件、数据库、其他应用程序的组件中。
 
     QAbstractItemModel提供了足够灵活的数据接口,以处理列表、列表、树形式表示数据的视图。然后当实现列表、表数据结构的新Model时,QAabstractListModle和QAabstractTableModel是更好的选择,因为它们提供了一些函数的默认实现。这些类每一个都可以被子类化,以提供专门类型的列表和表模型。
 
     QT提供了一些可以被用于处理数据模型的现成模型:
     1.QStringListModel 用来储存一个简单的QString列表
     2.QStandardItemModel 用来管理复杂的树结构,每个树结构能包含任意数据。
     3.QFileSystemModel 提供本地文件系统中文件和目录信息。
     4.QSqlQueryModel,QSqlTableModel和QSqlRelationalTableModel 使用Model/View标准 来访问数据库。
 
     Views 
     不同类型的视图提供了完整的实现:QListView显示列表项目,QTableView把数据显示在表格中,QTreeView显示分层的数据。这些类都是基于QAbstractItemView这个抽象基类。虽然这些类可以立即使用,但也可以被子类化提供定制的视图。
  
     Delegates
     QAbstractItemDelegate是Modie/View中Delegate的抽象基类,从Qt4.4开始默认的Delegate实现由QStyledItemDelegate提供,而且被作为Qt View的默认Delegate。QStyledItemDelegate和QItemDelegate是独立的都能使用。但是QStyledItemDelegate用当前的样式来渲染和创建Editor。所以在自定义Delegate时,建议使用QStyledItemDelegate作为基类。

5.Qt model view设计模式的更多相关文章

  1. Qt Model/View(官方翻译,图文并茂)

    http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用mode ...

  2. (转)Qt Model/View 学习笔记 (一)——Qt Model/View模式简介

    Qt Model/View模式简介 Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的 功能上的分离给了开发人员更大的弹性来定制数据项 ...

  3. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  4. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  5. (转)Qt Model/View 学习笔记 (二)——Qt Model/View模式举例

    Qt Model/View模式举例 Qt提供了两个标准的models:QStandardItemModel和QDirModel.QStandardItemModel是一个多用途的model,可用于表示 ...

  6. (一) Qt Model/View 的简单说明

    (一) Qt Model/View 的简单说明 .预定义模型 (二)使用预定义模型 QstringListModel例子 (三)使用预定义模型QDirModel的例子 (四)Qt实现自定义模型基于QA ...

  7. qt model/view/delegate

    Qt Model/View理解(一)---构造model https://blog.csdn.net/weixin_42303052/article/details/89233887 Qt Model ...

  8. Qt Model/View 的简单说明

    目录: (一) Qt Model/View 的简单说明 .预定义模型 (二)使用预定义模型 QstringListModel例子 (三)使用预定义模型QDirModel的例子 (四)Qt实现自定义模型 ...

  9. (转)Qt Model/View 学习笔记 (四)——创建新的Models

    创建新的Models 介绍 model/view组件之间功能的分离,允许创建model利用现成的views.这也可以使用标准的功能 图形用户接口组件像QListView,QTableView和QTre ...

随机推荐

  1. 织梦dedecms如何批量替换文章内容和缩略图

    文章来自:http://blog.sina.com.cn/s/blog_475ea1130101co6w.html 第一种方法: 进入后台,点左侧的采集,点选批量维护的数据库内容替换. 1.替换标题内 ...

  2. Python之高级库socketserver

    socket并不能多并发,只能支持一个用户,socketserver 简化了编写网络服务程序的任务,socketserver是socket的在封装.socketserver在python2中为Sock ...

  3. java-05String课堂练习

    1.阅读以下代码查看输出结果 public class StringPool { public static void main(String args[]) { String s0="He ...

  4. 循环比赛日程表(match)(分治)

    [问题描述]     设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空.     输入:M     输 ...

  5. hadoop-pig学习笔记

    A1 = LOAD '/luo/lzttxt01.txt' AS (col1:chararray,col2:int,col3:int,col4:int,col5:double,col6:double) ...

  6. poj 2262 Goldbach's Conjecture——筛质数(水!)

    题目:http://poj.org/problem?id=2262 大水题的筛质数. #include<iostream> #include<cstdio> #include& ...

  7. cpu高的问题的快速定位

    功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58速运技术部联合进行了一次线上 ...

  8. 二:HTML文本编译器 kindeditor-4.1.10 的使用 SpringMVC+jsp的实现

    这和一篇与上一篇的区别在与,上一篇是直接请求到action我们剩下的都是我们全部手动处理, 而这一片篇是由kindeditor内部处理,图片上传到本地,基本上没什么区别,但是有一点一定要注意的就是,这 ...

  9. 第二届PHP全球开发者大会(含大会的PPT)

    PHP全球开发者大会于2016年5月14日至15日在北京召开 更多现场图片请猛击: http://t.cn/RqeP7y9 ,  http://t.cn/RqD8Typ 最后,这次大会的PPT可以在这 ...

  10. Day3(1)linux文件系统及文件类型

    Linux的文件系统 根文件系统(rootfs) root filesystem LSB,FHS:(FileSystem Heirache Standard) /etc,/usr,/var,/root ...