没有合适的资源?快使用搜索试试~ 我知道了~
首页Qt Model/View Framework学习笔记
Qt Model/View Framework学习笔记
需积分: 36 12 下载量 199 浏览量
更新于2023-03-16
评论
收藏 462KB DOC 举报
详细的讲述了QT model view framework的具体内容,中文容易理解和掌握,可以结合qt assistant英文文档一起看
资源详情
资源评论
资源推荐
Qt Model/View 学习笔记
介绍
Qt 4 推出了一组新的 item view 类,它们使用 model/view 结构来管理数据与表示层的关系。
这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标
准的 model 接口,使得更多的数据源可以被这些 item view 使用。这里对 model/view 的结
构进行了描述,结构中的每个组件都进行了解释,给出了一些例子说明了提供的这些类如何使
用。
Model/View 结构
Model-View-Controller(MVC), 是从 Smalltalk 发展而来的一种设计模式,常被用于构建用
户界面。经典设计模式的著作中有这样的描述:
MVC
由三种对象组成。
Model
是应用程序对象,
View
是它的屏幕表示,
Controller
定义了用
户界面如何对用户输入进行响应。在
MVC
之前,用户界面设计倾向于三者揉合在一起,
MVC
对它们进行了解耦,提高了灵活性与重用性。
假如把 view 与 controller 结合在一起,结果就是 model/view 结构。这个结构依然是把数据
存储与数据表示进行了分离,它与 MVC 都基于同样的思想,但它更简单一些。这种分离使得
在几个不同的 view 上显示同一个数据成为可能,也可以重新实现新的 view,而不必改变底层的
数据结构。为了更灵活的对用户输入进行处理,引入了 delegate 这个概念。它的好处是,数
据项的渲染与编程可以进行定制。
如上图所示,model 与数据源通讯,并提供接口给结构中的别的组件使用。通讯的性质依赖于
数据源的种类
与 model 实现的方式。view 从 model 获取 model indexes,后者是数据项的引用。通过把
model indexes 提供给 model,view 可以从数据源中获取数据。
在标准的 views 中,delegate 会对数据项进行渲染,当某个数据项被选中时,delegate 通过
model indexes 与 model 直接进行交流。总的来说,model/view 相关类可以被分成上面所
提到的三组:models,views,delegates。这些组件通过抽象类来定义,它们提供了共同的接
口,在某些情况下,还提供了缺省的实现。抽象类意味着需要子类化以提供完整的其他组件希
望的功能。这也允许实现定制的组件。models,views,delegates 之间通过信号,槽机制来进
行通讯:
从 model 发出的信号通知 view 数据源中的数据发生了改变。
从 view 发出的信号提供了有关被显示的数据项与用户交互的信息。
从 delegate 发生的信号被用于在编辑时通知 model 和 view 关于当前编辑器的状态信息。
Models
所有的 item models 都基于 QAbstractItemModel 类,这个类定义了用于 views 和
delegates 访问数据的接口。
数据本身不必存储在 model,数据可被置于一个数据结构或另外的类,文件,数据库,或别的
程序组件中。
关于 model 的基本概念在 Model Classes 部分中描述。
QAbstractItemModel 提供给数据一个接口,它非常灵活,基本满足 views 的需要,无论数
据用以下任何样的形式
表现,如 tables,lists,trees。然而,当你重新实现一个 model 时,如果它基于 table 或 list
形式的数据结构,最好从 QAbstractListModel,QAbstractTableModel 开始做起,因为它们
提供了适当的常规功能的缺省实现。这些类可以被子类化以支持特殊的定制需求。子类化
model 的过程在 Create New Model 部分讨论
QT 提供了一些现成的 models 用于处理数据项:
QStringListModel 用于存储简单的 QString 列表。
QStandardItemModel 管理复杂的树型结构数据项,每项都可以包含任意数据。
QDirModel 提供本地文件系统中的文件与目录信息。
QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel 用来访问数据库。
假如这些标准 Model 不满足你的需要,你应该子类化
QAbstractItemModel,QAbstractListModel 或是
QAbstractTableModel 来定制。
Views
不同的 view 都完整实现了各自的功能:QListView 把数据显示为一个列表,QTableView 把
Model 中的数据以 table 的形式表现,QTreeView 用具有层次结构的列表来显示 model 中的
数据。这些类都基于 QAbstractItemView 抽象基类,尽管这些类都是现成的,完整的进行了
实现,但它们都可以用于子类化以便满足定制需求。
Delegates
QAbstractItemDelegate 是 model/view 架构中的用于 delegate 的抽象基类。缺省的
delegate 实现在 QItemDelegate 类中提供。它可以用于 Qt 标准 views 的缺省 delegate.
排序
在 model/view 架构中,有两种方法进行排序,选择哪种方法依赖于你的底层 Model。
假如你的 model 是可排序的,也就是它重新实现了 QAbstractItemModel::sort()函数,
QTableView 与 QTreeView 都提供了 API,允许你以编程的方式对 Model 数据进行排序。另外,
你也可以进行交互方式下的排序(例如,允许用户通过点击 view 表头的方式对数据进行排
序),可以这样做:把 QHeaderView::sectionClicked()信号与
QTableView::sortByColum()槽或 QTreeView::sortByColumn()槽进行联结就好了。
另一种方法是,假如你的 model 没有提供需要的接口或是你想用 list view 表示数据,可以用
一个代理
model 在用 view 表示数据之前对你的 model 数据结构进行转换。
便利类
许多便利类都源于标准的 view 类,它们方便了那些使用 Qt 中基于项的 view 与 table 类,它
们不应该被子类化,
它们只是为 Qt 3 的等价类提供一个熟悉的接口。这些类有
QListWidget,QTreeWidget,QTableWidget,它们提供了如 Qt 3 中的 QListBox,
QlistView,QTable 相似的行为。这些类比 View 类缺少灵活性,不能用于任意的 models,推
介使用 model/view 的方法处理数据。
介绍
Qt 提供了两个标准的 models:QStandardItemModel 和
QDirModel。QStandardItemModel 是一个多用途的 model,可用于表示 list,table,tree
views 所需要的各种不同的数据结构。这个 model 也持有数据。QDirModel 维护相关的目录
内容的信息,它本身不持有数据,仅是对本地文件系统中的文件与目录的描述。QDirModel 是
一个现成的 model,很容易进行配置以用于现存的数据,使用这个 model,可以很好地展示如何
给一个现成的 view 设定 model,研究如何用 model indexes 来操纵数据。
model 与 views 的搭配使用
QListView 与 QTreeView 很适合与 QDirModel 搭配。下面的例子在 tree view 与 list view
显示了相同的信息,QDirModel 提供了目录内容数据。这两个 Views 共享用户选择,因此每
个被选择的项在每个 view 中都会被高亮。
先装配出一个 QDirModel 以供使用,再创建 views 去显示目录的内容。这给我展示了使用
model 的最简单的方式。
model 的创建与使用都在 main()函数中完成:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSplitter *splitter = new QSplitter;
QDirModel *model = new QDirModel;
//从缺省目录创建数据
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);
tree->setRootIndex(model->index(QDir::currentPath()));
QListView *list = new QListView(splitter);
list->setModel(model);
list->setRootIndex(model->index(QDir::currentPath()));
//配置一个 view 去显示 model 中的数据,只需要简单地调用 setModel(),并把目录
model 作为参数传递
//setRootIndex()告诉 views 显示哪个目录的信息,这需要提供一个 model index,然后
用这个
//model index 去 model 中去获取数据
//index()这个函数是 QDirModel 特有的,通过把一个目录做为参数,得到了需要的
model index
//其他的代码只是窗口 show 出来,进入程序的事件循环就好了
splitter->setWindowTitle("Two views onto the same directory model");
splitter->show();
return app.exec();
}
上面的例子并没有展示如何处理数据项的选择,这包括很多细节,以后会提到。
Model
类
基本概念
在 model/view 构架中,model 为 view 和 delegates 使用数据提供了标准接口。在 Qt 中,
标准接口 QAbstractItemModel 类中被定义。不管数据在底层以何种数据结构存储,
QAabstractItemModel 的子类会以层次结构的形式来表示数据,结构中包含了数据项表。我
们按这种约定来访问 model 中的数据项,但这个约定不会对如何显示这些数据有任何限制。数
据发生改变时,model 通过信号槽机制来通知关联的 views。
Model Indexes
为了使数据存储与数据访问分开,引入了 model index 的概念。通过 model index,可以引
用 model 中的数据项,Views 和 delegates 都使用 indexes 来访问数据项,然后再显示出来。
因此,只有 model 需要了解如何获取数据,被 model 管理的数据类型可以非常广泛地被定义。
Model indexes 包含一个指向创建它们的 model 的指针,这会在配合多个 model 工作时避免
混乱。
QAbstractItemModel *model = index.model();
model indexes 提供了对一项数据信息的临时引用,通过它可以访问或是修改 model 中的数
据。既然 model 有时会重新组织内部的数据结构,这时 model indexes 便会失效,因此不应
该保存临时的 model indexes。假如需要一个对数据信息的长期的引用,那么应该创建一个
persistent model index。这个引用会保持更新。临时的 model indexes 由 QModelIndex
剩余21页未读,继续阅读
lingess
- 粉丝: 73
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0