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. 201621123014《Java程序设计》第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 答: 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集题目) 1.1 实验总结.并回答: ...

  2. spring学习-5

    spring表达式SpEL 语法#{..},为bean的属性进行动态赋值 通过bean的id对bean进行引用 调用方法以及引用对象中的属性 计算表达式的值 正则表达式的匹配 修改Address.ja ...

  3. SQL使用指南(1)—— 数据定义语言(DDL)

    1.使用create 语句创建表 CREATE TABLE table_name (column_name datatype[null|not null], column_name datatype[ ...

  4. Ubuntu 16.10 Apache PHP Server

    /******************************************************************************************* * Ubunt ...

  5. url参数的编码解码Demo

    为了保证在页面传递数据的安全性,我们通常会对Url传递的参数进行编码解码操作.我们写一个Demo剖析URL编码解码过程. 完整Demo下载地址 1. Url参数如何在服务端进行编码和解码. 1.1 U ...

  6. sklearn_算法选择

  7. java-10异常处理动手动脑

    1.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. import javax.swing.*; class AboutExcep ...

  8. 我的ubuntu新系统自动装软件脚本

    装一些常用软件 配一下环境变量 #!/bin/bash #download g++sudo apt-get install g++ -y#download codeblockssudo apt-get ...

  9. POJ 1276 Cash Machine(单调队列优化多重背包)

    Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38986   Accepted: 14186 De ...

  10. L2-013. 红色警报(dfs)

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...