QT中的模型与视图是一种架构,一种框架,与MVC框架类似,他目的是使得数据与界面相互分离
首先介绍MVC:
MVC作为一种可视化方法:三个字母分别代表(model)模型-(view)视图-(controller)控制器
模型代表的是数据集合,其对数据的查看以及获取还有任何存储的改变负责
视图代表的是面向用户的数据,就是用户所能看到的数据
控制器则是用户和视图之间的媒介,他将用户的操作转换为浏览或者编辑数据的请求.比如要改变某个视图框中的数据,那么就需要这个控制器,根据用户的需要,改变数据再将数据由视图到模型.
在QT中没有控制器, 只有模型和视图,取代控制器的则是委托 在下图中也可以看出委托的通过编辑也可将数据的改变反馈给模型.模型再相应的和数据做出交互,在图中也可以看出视图从模型中读取数据.
还有一种好处就是我们需要修改底层存储的时候,在这个框架下面不需要动视图,只需要修改模型就可以,视图还可以正常的工作,视图也不能简单的理解为显示数据的,比如说在表格视图中,那么网格线的绘制,以及滚轮的绘制,数据项的选择都是视图的工作. 我的理解为显示的部分,只要是给人看到的,就是视图的工作.
在QT中模型视图架构我的理解是 模型可以获取我们源数据集合中的数据,这个源头就比较多了比如从数据库中,或者是List中,又或者是String中,总之他先将数据从这些源头中拿出来.然后再和需要显示的视图绑定,他可以绑定多个视图,也就是说在多个显示数据的视图中都可以用一个模型.
模型的结构
在QT中,所有的数据存储都被模型最后转换为一种层次结构(就是一种树形的结构).如此的话,视图在访问数据的时候那么比较规范化的.当数据是列表(list)或表格(tab)结构的时候,则可以把其看作是只含有顶层节点,不含任何子节点的树形结构,如下图所示.
模型的索引
索引实现了QT的数据和显示的分离,只有模型知道如何取源数据中的数据,视图和委托通过索引来访问数据项.索引如何拿到,是需要从视图中去拿到的,因为做什么操作是用户说了算的.比如在某一行中去添加某一个数据,拿到这一行.是从视图中去拿到的
(1) 树形结构
获取数据项A的模型索引,A的父索引由一个无效模型索引指定。
QModelIndex iA = model.index(0,0, QModelIndex());
//获取数据项B的模型索引,B位于父索引iA的第1行第1列位置。
QModelIndex iB = model.index(1,1, iA);
(2) 表格结构
//获取数据项B的模型索引,B是顶级数据项,因此其父索引是一个无效索引。
QModelIndex iB = model.index(1,2, QModelIndex());
(3) 列表结构
//获取数据项B的模型索引,B是顶级数据项,因此其父索引是一个无效索引。
QModelIndex iB = model.index(1,0, QModelIndex());
现在总结以下如何通过模型视图架构获取数据
1.设置相应的模型/视图结构 比如 QStringListModel QListView
2.视图与模型绑定 listView->setModel(model);
3.获取索引,做出你相应的操作.
具体代码解释:
QStringList data; //设置数据源
data << "Letter A" << "Letter B" <<"Letter C";
// QStrinrListModel
model = new QStringListModel(this); //设置模型结构
model->setStringList(data); //给模型添加数据
listView = new QListView(this); //设置视图结构
listView->setModel(model); //视图模型相互绑定
获取索引(此时希望数据发生什么操作,是需要我们人为进行设置的)
在这个例子中我们想要在 Letter C 之前添加某一个数据,点击了insert按钮那么,此时我们肯定是需要一个槽函数的,在槽函数中我们首先要拿到索引,拿到索引之后向下对模型交互,然后再向上对视图交互. 代码如下:
QModelIndex currIndex = listView->currentIndex(); //在视图中获得当前索引
model->insertRows(currIndex.row(),1); //往前一行插入元素 在这个上面插入几个元素
model->setData(currIndex,text); //model利用索引增加数据
listView->edit(currIndex);//更新视图.
qDebug()<<model->stringList();//打印模型数据
第一节学习完结