qt4 Model/View编程:Model/View 编程简介

原创 2007年10月11日 12:45:00
主要知识点:
       Model/View体系结构
              模式(Models)
              视图(Views)
              代理(Delegates)
              排序(Sorting)
              工具类(Convenience Class)
       Model/View组件
 
QT4引进了一个新的对象视图类集,使用所谓的Model/View体系结构来管理数据和数据对用户的呈现之间的关系.这种体系结构使得功能分离.分离后,给开发人员定制对象的呈现以更大的灵活性;而且提供了一个统一的标准模式接口,允许广泛的数据源被现有的对象视图所使用.在本文中,我们给出一个Model/View结构的简洁介绍,列出相关的概念,然后描述对象视图系统的体系结构.在体系结构中出现的每一个组件都被解释了,并且给出例子来说明怎样使用提供的了类.
 
.Model/View体系结构

Smalltalk经常被用了构建用户接口, 而MVC ( Model-View-Controller ) 这种设计模式正是起源于Smalltalk. 在” Design Patterns” 一书中, Gamma et al. 这样写道:

“MVC包含三种对象. Model是应用对象, View是它的屏幕呈现, 而Controller定义了用户接口对用户输入的反应方式. 在MVC出现之前, 用户接口的设计趋向于将这三类对象糅杂在一起. MVC将它们分离开, 增加灵活性和重用.
若是将View和Controller对象组合, 就得到了Model/View体系结构. 这样仍然将数据存储的方式和数据对用户呈现的方式分离开, 但是提供的是基于同样原则的更简单的框架. 这种分离使得在不改变底层数据结构的情况下,在多种不同视图中显示同样的数据和使用新的视图成为可能. 为了允许灵活的用户输入控制,我们引进了delegate的概念. 在这个框架中使用delegate的优点是,允许定制数据对象的刷新和编辑.
 

model/view 体系结构
Model和数据源通信,为体系结构中的其他部件提供接口. 通信的性质依赖于数据源的类型和model的实现方式.

View从model获取model index;它们是对数据对象的引用.通过提供model的model index,View可以访问数据源中的数据对象.

在标准的views中,delegate刷新数据对象.当对象被编辑了,delegate将使用model index直接和model通信.
 
一般地,model/view类可以归纳成上面讨论的三组类型中:models,views,和delegates. 每个组件被抽象类定义,这些抽象类提供了公共接口,并且有时,默认实现了这些特性. 抽象类都将被继承,从而提供给其他部件使用的完整功能集;同时允许要写的特殊组件.
 
Models,views和delegates之间通过signals和slot通信:
.model发送signal通知view数据源的数据发生改变
.view发送signal提供和显示的对象的用户接口信息
.当编辑时delegate发送signal通知model和view 编辑器的状态
 
.Models
所有对象的model都是基于类QAbstractItemModel的. 这个类定义了view和delegate存取数据的接口.数据本身不必须存储在model中;可以保存于一个数据结构,或者是由一个独立类,文件,数据库或其他应用部件提供的仓库.
在Model Classes节中将会介绍model周边的基本概念.
QAbstarctItemModel提供了足够灵活的数据接口给view调用,以table,list和tree方式显示数据.然而,当实现列表和表格类数据结构的新model时,QAbstractListModel和QAbstractTableModel类是更好的起点,因为它们提供更贴切的公共函数的缺省实现.每个类可以被继承创建model来支持特殊类型的list和table.
在”Createing New Models”一节中将讨论继承类的过程.
QT提供了一些准制作的model,它们可以被用于管理数据:
.QStringListModel用于存储QString对象的简单列表
.QStandardItemModel管理了更复杂的树形结构的对象,每个对象可以包含任意数据
.QDirModel提供了本地文件系统的文件和目录信息
.QSqlQueryModel,QSqlTableModel,和QSqlRelationalTableModel用于使用model/view方式访问数据库
如果这些标准的model不能满足你的要求,你可以通过继承QAbstractItemModel,QAbstractListModel或QAbstractTableModel来创建你自己的自定义model.
 
.Views
提供了不同类型View的完整实现:QListView列出一个列表的对象,QTableView显示了表格model中的数据,而QTreeView显示了一个继承列表中的数据对象.这些类都是基于抽象父类QAbstractItemView的.虽然这些类都是准使用实现的,也可以子类化它们类提供定制的view.
在”View Classes”一节中将检测可用的View.
 
.Delegates
在Model/View框架中,QAbstractItemDelegate是delegate的抽象基类. 缺省的delegate实现由QItemDelegate提供,它也是标准QT View缺省使用的.
将在”Delegate Class”中描述Delegate.
 
.Sorting
在Model/View体系结构中有两种方式排序;它们依赖于你的下层model.
如果你的model是可排序的,比如重新实现了函数QAbstractItemModel::sort(),QTableView和QTreeView提供了API允许你程序化地对你的model数据排序. 另外,你可用激活交互排序(如:允许用户通过点击view的排头来对数据排序),连接信号QHeaderView::sectionClicked()到槽QTableView::sortByColumn()或者槽QTreeView::sortByColumn().
如果你的model没有需要的接口或者你像使用一个列表View来信显示你的数据,替代的排序方式是使用一个代理model来改变你的model的结构,然后在View中显示数据.在”Proxy Models”中将有详细的介绍.
 
.Convenience Classes
为了实际应用QT创建了大量的小部件类convenience classes,这些应用依赖于Qt的基于对象的View和表格类.不必对它们子类化,但是存在一些熟悉的接口提供给QT3.这样的类的例子包括QListWidget,QTreeWidget,和QTableWidget;它们的行为很类似于QT3中的QListBox,QListView, 和QTable.
这些类的灵活性不如View类,不能用于任意的model.我们建议,除非强烈的需要一个基于物件的类集,否则使用model/view来控制数据.
如果你希望利用model/view方法提供的特性,使用基于物件的接口时,考虑使用View类,如QListView,QTableView和QTreeView连同QStandardItemModel.
 
.Model/View Components
以下章节介绍在QT中使用Model/View模式的方式.每节包含一个使用的例子,然后下节中将向你演示怎样创建部件.
 

QT开发(三十八)——Model/View框架编程

QT开发(三十八)——Model/View框架编程一、自定义模型1、自定义只读模型    QAbstractItemModel为自定义模型提供了一个足够灵活的接口,能够支持数据源的层次结构,能够对数据...
  • A642960662
  • A642960662
  • 2017年03月26日 12:48
  • 576

Qt学习笔记-----Model/View架构

为了实现数据的存储和表现分离,Qt提供了Model/View架构,包括三个部分,分别是模型(Model),视图(View),委托(delegate)。 Model用于访问底层数据,也就是说为其他组件访...
  • sinat_35261315
  • sinat_35261315
  • 2017年01月25日 15:08
  • 665

Model/View 教程

 说明:这篇博客基本都是翻译于Qt官方的Model/View Tutorial教程,无法理解的地方建议转到原文,同时,由于译者水平有限,如有差错欢迎指出。 原文:http://qt-proje...
  • wuli2496
  • wuli2496
  • 2015年04月15日 22:05
  • 771

ModelAndView: materialized View is [null];和Action的onSubmit()方法不被执行

         ModelAndView: materialized View is [null];        priceIncrease                            ...
  • xiandelaji
  • xiandelaji
  • 2007年09月06日 18:28
  • 4808

Model/View框架总体架构

原文:http://book.2cto.com/201209/4214.html Model/View框架中,所有模型类具有共同的抽象基类QAbstractItemModel,所有视图类具有共同...
  • Walker19900515
  • Walker19900515
  • 2015年05月11日 22:05
  • 822

Qt Model/View编程介绍

Qt中包含了一系列的项视图类,它们使用model/view的架构去管理数据之间的关系以及它们被展示给用户的方式。这种由这种架构引进的功能分离特性给了开发者很大的灵活性去自定义自己的展示方式,并且提供了...
  • Amnes1a
  • Amnes1a
  • 2017年03月28日 07:52
  • 1724

CSS Object Model View整理

一、window view properties(窗口属性) innerWidth 和 innerHeight outerWidth 和 outerHeight page...
  • shadow_yn
  • shadow_yn
  • 2015年12月15日 23:13
  • 377

4+1VIEW 软件系统视角模型

4+1view 是一個由 philippe kruchten 設計的一種用於同時表達軟件系統架構之多種觀點的模型。  從系統共同利益人的角度(包括end-user、開發者和項目管理者),分成4個觀...
  • pups1108
  • pups1108
  • 2017年01月26日 17:15
  • 550

MVC 在View中引用Model时,不使用命名空间的配置

如图,新建一个mvc的应用程序, @model MvcApplication2.Models.RegisterModel时使用了到了命名空间MvcApplication2.Models。 ...
  • u011435642
  • u011435642
  • 2014年02月19日 11:43
  • 645

qt model 与 view 的数据显示

比如trade插件中,model中存储的数据,是放在QList中的。 那为何view调用了SetModel()后,显示的就是表格呢? 因为,view是QTableView,是个表格View...
  • zhangbinsijifeng
  • zhangbinsijifeng
  • 2015年09月30日 15:49
  • 354
收藏助手
不良信息举报
您举报文章:qt4 Model/View编程:Model/View 编程简介
举报原因:
原因补充:

(最多只允许输入30个字)