Qt学习(一)模型与视图

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();//打印模型数据

 

第一节学习完结

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值