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. linux下配置cvs服务器以及cvs常用命令

    .查看系统是否安装有cvs #cat /etc/services | grep cvspserver 看看是否有: cvspserver /tcp #CVS client/server operati ...

  2. 浅学soap--------1

    无wsdl文件: Clint.php //客户端 <?php $soap = new SoapClient(null,array('uri'=>'server','location'=&g ...

  3. boost开发指南

    C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...

  4. altibase MDB的创建sequence的举例

    create sequence seq_deduct_record_history start with 1 increment by 1 minvalue 1 nomaxvalue;

  5. 《Javascript高级程序设计》阅读记录(七):第七章

    <Javascript高级程序设计>中,2-7章中已经涵盖了大部分精华内容,所以摘录到博客中,方便随时回忆.本系列基本完成,之后的章节,可能看情况进行摘录. 这个系列以往文字地址: < ...

  6. Java 虚拟机-Java内存区域

    简要介绍Java的内存区域: 运行时数据区域 HotSpot虚拟机对象 一.概览 二.运行时数据区域 2.1 程序计数器 Program Counter Register,代表当前线程所执行的字节码的 ...

  7. 获得Oracle中刚插入的数据的ID(for produce)

    在sql sever中实现插入数据的自动增长是很容易的,但是在oracle数据库中实现这一操作不是很容易,同时要想在.net中实现获取新插入数据的id,而 且不会出现读错的情况,就更显得困难了,为了解 ...

  8. Java: What is the difference between <init> and <clinit>?

    Stack Overflow 上的一个问题:Java: What is the difference between <init> and <clinit>?   JVM Sp ...

  9. sql server将字符串转换为 uniqueidentifier 时失败

    sql server查询中出现 将字符串转换为 uniqueidentifier 时失败异常 原因为id设置为uniqueidentifier 字段,在where查询时需要做转换cast(id as ...

  10. Django 多条件多表查询实例问题

    当时想做一个多条件查询,但是对于要查询的信息,是分布在不同的表里,这就涉及到了多表查询问题. DjangoBook里提到了一些查询的方式,但是不够全面,就去百度搜了下. 当去网上百度搜多表查询,或多条 ...