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编程的艺术》——8.1model/view结构的底层概念

model/view结构基于一个概念——将数据与现实分离。这样做,一份数据可以容易地在不同窗口里面展示,展示的形式可以通过list或者table。这样,数据源理论上不关心view如何现实它,view也...
  • maxiee
  • maxiee
  • 2013年08月17日 13:36
  • 746

用QT的model/view/delegate接口实现自定义的窗口渲染

欢迎提出意见,因为本就是为交流而分享。 qt的model接口(qabstractItemModel)管理的数据抽象来说是节点树,最顶层的根节点可以有N行M列个子item,而每个item又可以有自己...
  • upnow2014
  • upnow2014
  • 2015年03月15日 17:12
  • 1404

【QT学习】View和Model

http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用mo...
  • Jammg
  • Jammg
  • 2016年06月20日 02:32
  • 1835

Backbone入门基础 - Model和View基本用法

简单介绍Backbone的Model和View的基本用法以及两者间的关系,并提供用法实例
  • joyce_lcy
  • joyce_lcy
  • 2016年08月17日 11:32
  • 1519

MVVM模式--Model,View,ViewModel三者平衡

MVC的概念已经逐渐被大家所熟悉——Model,View,Controllor。但是在最近的开发过程中,特别与WPF相关的开发中,发现MVVM这个模式相当好用,而且还可以很方便的通过UnitTest了...
  • liuyongkun1003
  • liuyongkun1003
  • 2015年09月14日 17:05
  • 1704

ym——Android开发MVP模式(解决了View和Model的耦合)

1、模型与视图完全分离,我们可以修改视图而不影响模型 2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部 3、我们可以将一个Presenter用于多个视图,而不需要改变...
  • cym492224103
  • cym492224103
  • 2014年08月23日 11:00
  • 10205

Qt中model/view设计模式

Qt Model/View 学习笔记 (一) Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系。这种结构带来的 功能...
  • u013923131
  • u013923131
  • 2014年10月10日 15:36
  • 3178

Qt Model/View之实现Item自定义显示

介绍 Delegate 代理类被用来显示和编辑Item项。为了能实现自定义的Item,需要子类化代理类,并实现自己的paint() 和 sizeHint()方法。paint()方法会被每个Item调用...
  • sxpsxp12
  • sxpsxp12
  • 2017年06月05日 10:58
  • 683

QT View及Model源码解析

QT的Model用于保存数据,而QTView只是用于显示界面,大概关系如下,View的数据private中一般会有drawcell等方法,用于从model里面取数据绘制文字,表格,绘制的时候会根据每个...
  • hjing1988
  • hjing1988
  • 2015年01月01日 10:43
  • 3220

QT View及Model源码解析

QT View及Model源码解析 QT的Model用于保存数据,而QTView只是用于显示界面,大概关系如下,View的数据private中一般会有drawcell等方法,用于从model里面取数据...
  • yangshuangtao
  • yangshuangtao
  • 2016年09月01日 14:25
  • 630
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt4 Model/View编程:Model/View 编程简介
举报原因:
原因补充:

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