当前位置:
文档之家› 基于Model_View嵌入式Qt应用程序框架的研究与实现
基于Model_View嵌入式Qt应用程序框架的研究与实现
模型和数据源通信, 为体系结构中的其他部件提供接口。通信的性质依赖于数据源的类型和模型的 实现方式。视图从模型获取 mo del index; 它们是对数据对象的引用。通过提供模型的 m odel index , 视 图可以访问数据源中的数据对象。
在标准的视图中, 代理刷新数据对象。当对象被编辑了, 代理将使用 m odel index 直接 和模型通 信。模型、视图、代理之间通过信号和槽 ( sig nals/ slo t) 通讯, 模型发送信号通知视图数据源的数据发 生变化; 视图发送信号提供和显示的对象的用户接口信息; 当编辑时代理发送信号 ( signal) 通知模型 和视图编辑器的状态。
2) 视图 Qt 提供 了 不 同类 型 视 图 ( V iew ) 的 完 整 实现, QL ist View 列 出一 个 列 表 的 对象, QT ableV iew 显示了表格 model 中的数据, Q T reeView 显示了一个继承列表中的数据对象。这些类都是 基于抽象父类 QAbst ractIt emView 的。
PuzzleDelegate ( Q W idg et * parent) : Q A bstr act ItemDeleg ate ( par ent) { } ; void paint ( QPainter * painter, const QStyleOptionV iewItem &option, const QM odelIndex &index) const; / / 窗口重绘
195
1) 模型 所有对象的模型 ( M odel) 都是基于类 Q A bstr act It emM odel 的[ 3] 。这个类定义了视图和 代理存取数据的接口。数据本身不必存储在模型 ( M odel) 中, 可以保存于一个数据结构, 或者是由一 个独立类文件、数 据库或其他应 用部件提供 的仓库。系统定义 的常用类 如下: QA bstarct It emM odel ( 模型基类) 、Q St ringL ist M odel ( 用于数据源是字符串对象) 、QSt andardItemM odel ( 用于数据源是复 杂数据对象) 、QDirM odel ( 用于数据源是文件目录对象) 、QSqlQuery Mo del ( 用于数据源来自数据库) 、 QSqlT ableModel ( 用于数据源来自数据库) 、QSqlRelat ionalT ableM odel ( 用于数据源来自数据库) 。
2 基于模型 /视图框架设计
为了验证和使用此模型, 笔者使用 Q t 的模型/ 视图框架以嵌入式拼图游戏 ( P uzzleGame) 作为开
发对象, 来描述整个框架的设计过程。
图 2 描述了 PuzzleGame 的基本模型/ 视图类
的交互关系。其中, S/ S 表示使用信号和槽机制
进行通讯, 模型类 ( PuzzleModel) 主要负责数据
class PuzzleV iew : public Q T ableV iew / / 继承网格视图 {
pu b li c: PuzzleV iew ( Q Widg et * par ent) ; vo id key pr essEvent ( Q Key Ev ent * ev ent) ; / / 键盘事件 vo id mo useP ressEv ent ( Q M ouseEvent * event) ; / / 鼠标按下事件 }
2 2 PuzzleView 类的设计 视图类从模型类中通过 mo del index 的索引来获取数据, P uzzleGame 的数据就是图片及其位置信
息。并利用代理类对数据进行显示渲染。他们之间的交互通过 Qt 的信号和槽机制 ( Signal and Slo t) 来 进行, 在 Qt 的基本类中已经提供了很好的缺省, 实现因此只需要继承标准视图即可。视图要从用户的 输入中获取信息来更新模型中的数据, 在 PuzzleGame 中要响应用户的鼠标事件和键盘事件, 因此该例 需要完成这几个事件函数, 并在函数中来更新视图中的数据项, 所以视图类的设计如下:
推出的一种新的模式。它使用模型/ 视图结构来管理数据与
表示层的关系, 这种体系结构使得功能分离。分离后, 给开
发人员定制对象的呈现以更大的灵活性; 而且提供了一个统
一的标准模式接口, 允许广泛的数据源被现有的对象视图所
使用, 给嵌入式开发带来的十分规范化的机制[ 1] 。
Qt 的模型/ 视图模式是把数据存储与数据表示进行了分
长江大学学报 ( 自然科学版) 2009 年 9 月 第 6 卷 第 3 期: 理工
194
Journal of Yangtze University ( Nat Sci Edit) Sep 2009, Vo l 6 N o 3: Sci & Eng
基于 Model/ View 嵌入式 Qt 应用程序 框架的研究与实现
阮班勇, 胡 杰, 王 剑 ( 长江大学计算机科学学院, 湖北 荆州 434023)
[ 摘要] Q t ( 由挪威 T r ollT ech 公司开发的 C+ + 图形用 户界面库) 的模型/ 视图 ( M o del/ V iew ) 是模 型/
视图/ 控制 ( 简称 M VC) 的一个子集, 是一种应用程序 框架机制。介 绍了 Q t 的 M V C 的 设计思 想、原理
和应用方法, 仔细分析了 Q t 中关于模型/ 视图体系结构和原理, 着重介绍了模 型/ 视图 在嵌入式程 序的前
期框架设计中的实现和应用方案, 并给出了拼图 游戏 ( Puzzle Game) 框 架设计实 例。这一 框架的 应用极
大地提高了嵌入式 Q T 界面程序的开发效率。
[ 关键词] Q t; 嵌入式 ; 模型/ 视图; M V C
3) 代理 与 MV C 模式不同, Qt 的模型/ 视图模式没有用于与用户交互的完全独立的组件。一般 来讲, 视图 ( V iew ) 负责把数据展示给用户, 也处理用户的输入。为了获得更多的灵活性和交互性, 可以通过代理执行。它既提供输入功能又负责渲染视图中的每个数据项。
在模型/ 视图框架中, QAbst ractItemDelegate 是代理的抽象基类。代理通过实现 paint ( ) 和 sizeH int ( ) 以达到渲染内容的目的。对于简单的代理, Qt 提供了 QIt emDeleg at e 类来渲染数据, 它提供了上述函 数的缺省实现, 它也是标准 Qt 视图缺省使用的。 1 2 模型/ 视图实现原理
eVidw 完成窗口的重绘工作 ( 数据渲染) 。
2 1 PuzzleModel 类的设计
PuzzleM odel 主要的功能是获取数据、保存数据、操作数据。因此在类的设计中根据游戏的特性直
接继承 QAbst ract T ableModel 类, 必须实现 3 个纯虚函数 row Count 、colo unCount 、dat a, 以给视图类
除了以上 标准 模 型类, 用户 可以 继 承 QA bstr act It emM odel、QA bstr act ListM odel 或 QAbst ract T ableM odels类来创建自定义模型类。以上类都是独立于视图的。
在 Qt 中, 标准接口 QAbst ract ItemM odel 的子类会以层次结构的形势来表现数据, 结构中包含了 数据项表。按照这种约定来访问模型中的数据项, 但这个约定不会对如何显示这些数据有任何的限制。 数据发生改变时, 模型通过信号和槽机制来通知关联的视图。
vo id sizeH int ( const Q St yleO ptionV iew Item & o ption, const Q M odelIndex & index ) cons ; / / 自动适应窗口大小改变
的存 取, 屏蔽 底 层 的 数 据录 入 方 式。视 图 类
( PuzzleView) 除了获取和更新 PuzzleModel 中的
数据外还负责数据的的显示, 获取用户的输入并 交互, 代理类 ( PuzzleDelegate) 主要帮助 Puzzl
图 2 Puzzle Game 模型/ 视 图/ 代理的数据交互图
pu b li c: PuzzleM odel ( Q Object * parent = 0) ;
~ PuzzleM odel ( ) ; int Q AbstractItemM odel: : r ow Co unt ( co nst Q M o delIndex & parent = Q M odelIndex ( ) ) const ; / / 计算行的数目 int QAbstractItemM odel: : columnCount ( const QM odelIndex& parnentt = QModelIndex ( ) ) const ; / / 计算列的数目 vo id M o ve ( const Q M odelIndex & index) ; / / 移动效果后数据的修改 }
细节, 而不影响到模型和视图本身, 这对于快速的定制漂亮的界面是有好处的。
[ 收稿日期] 2009- 05- 25 [ 作者简介] 阮班勇 ( 1986- ) , 男, 2006 年大学入学, 现主要从事计算机方面的学习。
长江大学大学生创新实验计划校级项目。
第 6 卷 第 3 期: 理 工
阮班勇等: 基于 M odel /V iew 嵌Βιβλιοθήκη 式 Q t 应用程序框架的研究与实现
提供接口。除此之外笔者还要设计数据的操作函数 Mo ve, 来移动游戏中的图片。以下是 PuzzleM odel
196
长江大学学报 ( 自然科学版)
2009 年 9 月
的具体定义: