一、model/view介绍
1、来源
Qt中的model/view结构由smalltalk公司的MVC结构发展而来。MVC有三种对象组成:model、view、contoller:
model表示数据集,每种数据都有自己的数据模型,不管底层的数据集是什么样子,model提供给视图的API都是相同的
view视图是面向用户的那些数据。同一时间,对于大数据集只有少量的数据对用户是可见的,而这部分可见的数据就是视图请求的。
controller是用户和视图之间的媒介,它把用户的操作转换为对数据的浏览或者编辑请求。
MVC的基本思路就是将数据的存储和表示分开分离。
2、Qt中的model/view
Qt中的model/view结构和MVC的基本思路一样,只是讲view和controller结合在一起。
model负责底层数据的存储,向上提供API。
view负责上层数据的显示,不同的视图可以呈现给不同的用户。
这种数据的存储和显示分离的方式,使得在不同的view上可以显示相同的数据,而改变view时对底层的数据没有影响
Qt中的model/view添加的代理delegate,model可以直接给view发送数据,或者经过delegate修改之后在发送给view。
将模型与视图分离之后,在处理大数据集的时候,可以提高效率;当底层数据存储方式改变之后,只需要修改model,而不需要许改view
3、三个组件通信
在Qt的model/view中有3个组件,他们之间的通信采用信号和槽机制
model发出的信号通知view数据源发生了变化
view发出的信号提供了显示的数据项与用户交互的信息
delegate发出的信号用于在编辑时通知model和view当前的编辑状态
model为view和delegate提供了标准的接口来访问数据,这些接口在QAbstractItemModel中定义,这个类是所有model的基类;同理QAbstractItemView是所有view的基类。
二、使用model/view
1、Qt提供的model
QAbstractItemModel是所有model的基类,数据不需要存储在model中,可以存储在其他的地方。model为数据提供一个接口,它非常的灵活,对于不同的view基本满足要求
QAbstractItemModel下面又有子类QAbstractListModel、QAbstractTableModel、QStandardItemModel等等。如果要实现的model是基于list类型的数据结构那么你应该继承自QAbstractListModel,如果要实现的model是基于table类型的数据结构,那么你应该继承QAbstractTableModel。
Qt提供了一些可以直接使用的model:
QStringListModel存储简单的QString列表
QDirModel提供本地系统中的文件和目录信息
QStandardItemModel管理复杂的树形结构数据
QSqlQueryModel、QSqlTableModel用来访问数据库
Qt中还有3个经常使用的view:
QListView、QTreeView、QTableView
同一个model可以用不同的view显示出来
QDirModel model;
QListView list;
QTreeView tree;
QTableView table;
list.setModel(&model);
tree.setModel(&model);
table.setModel(&model);
2、model index
不管底层的数据如何显示,在model中Qt的数据会有以下3种显示方式
view使用index来访问model中的数据项,从来不用关心底层的数据如何存储。一个model可以作为一个简单的表来访问,数据项由行和列定位,同时还应该提供父项的索引:
QModelIndex index=model->index(row,col,parentIndex);
当提供的父项无效时,系统会默认为顶级父项
3、data
有了index,我们就可以通过data方法获取数据:
QVariant value = model->data(index, role);
4、role
model中的数据可以作为角色来使用,为不同的环境提供不同的数据。角色决定了数据如何在view中显示,角色在Qt中是一个枚举类型
三、实例
-
#include <QApplication>
-
#include <QDirModel>
-
#include <QTreeView>
-
#include <QListView>
-
#include <QTableView>
-
#include <QSplitter>
-
#include <QtGui>
-
-
int main(int argc, char *argv[])
-
{
-
QApplication app(argc, argv);
-
-
QStringList str;
-
str<<"11"<<"22"<<"33"<<"44";
-
-
//model
-
QStringListModel *model = new QStringListModel(str);
-
//view
-
QListView list;
-
QTreeView tree;
-
QTableView table;
-
-
list.setModel(model);
-
table.setModel(model);
-
tree.setModel(model);
-
-
QSplitter *splitter = new QSplitter();
-
splitter->setOrientation(Qt::Vertical);
-
splitter->addWidget(&list);
-
splitter->addWidget(&table);
-
splitter->addWidget(&tree);
-
splitter->show();
-
-
QModelIndex ind = model->index(1,1);
-
QVariant value = model->data(ind, Qt::DisplayRole);
-
qDebug()<<value;
-
-
return app.exec();
-
}
阅读(3397) | 评论(0) | 转发(0) |