欢迎来到天天文库
浏览记录
ID:13467897
大小:463.50 KB
页数:30页
时间:2018-07-22
《qt model view 学习笔记》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、QtModel/View学习笔记http://doc.trolltech.com/main-snapshot/model-view-programming.html介绍Qt4推出了一组新的itemview类,它们使用model/view结构来管理数据与表示层的关系。这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接口,使得更多的数据源可以被这些itemview使用。这里对model/view的结构进行了描述,结构中的每个组件都进行了解释,给出了一些例子说明了
2、提供的这些类如何使用。Model/View 结构Model-View-Controller(MVC),是从Smalltalk发展而来的一种设计模式,常被用于构建用户界面。经典设计模式的著作中有这样的描述:MVC由三种对象组成。Model是应用程序对象,View是它的屏幕表示,Controller定义了用户界面如何对用户输入进行响应。在MVC之前,用户界面设计倾向于三者揉合在一起,MVC对它们进行了解耦,提高了灵活性与重用性。假如把view与controller结合在一起,结果就是model/view结构。
3、这个结构依然是把数据存储与数据表示进行了分离,它与MVC都基于同样的思想,但它更简单一些。这种分离使得在几个不同的view上显示同一个数据成为可能,也可以重新实现新的view,而不必改变底层的数据结构。为了更灵活的对用户输入进行处理,引入了delegate这个概念。它的好处是,数据项的渲染与编程可以进行定制。如上图所示,model与数据源通讯,并提供接口给结构中的别的组件使用。通讯的性质依赖于数据源的种类与model实现的方式。view从model获取modelindexes,后者是数据项的引用。通过把m
4、odelindexes提供给model,view可以从数据源中获取数据。在标准的views中,delegate会对数据项进行渲染,当某个数据项被选中时,delegate通过modelindexes与model直接进行交流。总的来说,model/view相关类可以被分成上面所提到的三组:models,views,delegates。这些组件通过抽象类来定义,它们提供了共同的接口,在某些情况下,还提供了缺省的实现。抽象类意味着需要子类化以提供完整的其他组件希望的功能。这也允许实现定制的组件。models,vi
5、ews,delegates之间通过信号,槽机制来进行通讯:从model发出的信号通知view数据源中的数据发生了改变。从view发出的信号提供了有关被显示的数据项与用户交互的信息。从delegate发生的信号被用于在编辑时通知model和view关于当前编辑器的状态信息。Models所有的itemmodels都基于QAbstractItemModel类,这个类定义了用于views和delegates访问数据的接口。数据本身不必存储在model,数据可被置于一个数据结构或另外的类,文件,数据库,或别的程序组
6、件中。关于model的基本概念在ModelClasses部分中描述。QAbstractItemModel提供给数据一个接口,它非常灵活,基本满足views的需要,无论数据用以下任何样的形式表现,如tables,lists,trees。然而,当你重新实现一个model时,如果它基于table或list形式的数据结构,最好从QAbstractListModel,QAbstractTableModel开始做起,因为它们提供了适当的常规功能的缺省实现。这些类可以被子类化以支持特殊的定制需求。子类化model的过程
7、在CreateNewModel部分讨论QT提供了一些现成的models用于处理数据项:QStringListModel 用于存储简单的QString列表。QStandardItemModel 管理复杂的树型结构数据项,每项都可以包含任意数据。QDirModel 提供本地文件系统中的文件与目录信息。QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel用来访问数据库。假如这些标准Model不满足你的需要,你应该子类化QAbstractItemModel,Q
8、AbstractListModel或是QAbstractTableModel来定制。Views不同的view都完整实现了各自的功能:QListView把数据显示为一个列表,QTableView把Model中的数据以table的形式表现,QTreeView 用具有层次结构的列表来显示model中的数据。这些类都基于QAbstractItemView抽象基类,尽管这些类都是现成的,完整的进行了实现,但它们都可以用于子类化以便满足定
此文档下载收益归作者所有