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

主要知识点:
       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模式的方式.每节包含一个使用的例子,然后下节中将向你演示怎样创建部件.
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值