QT5中Model/View模型的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/evil_119/article/details/82908722

该文章不对model/view的初级使用做解释

qt引入Model/view结构,目的是为了提高传统QTabelWidget等的大数据刷新的效率。既然是为高效率显示而设计的,我们使用时就需要对齐设计思路做了解。

view的继承模型如下图:

model继承模型如下图:

结合两个类继承图,我们可以看出Model/view是完全分开设计的,目的就是解耦合,Model只做数据管理,view只做显示,view与model之间的通信,就是一个重要函数了setModel,大可猜出该函数建立起了model/view之间的信号槽连接(因为笔者是win系统,没有下载源码,从严谨性来说只能说是猜测了,里面肯定有一堆connect()....),选择什么view,及view的使用其实比较简单(通过继承关系图也可以看出来),我们重点说Model,常用的Model大体可分为两类:一类是抽象接口分支下的常用数据模型,二类是数据委托,Delegate结尾的,这一类主要解决的是我们在view中显示的方式的问题,如:这类型列表,通常结合数据编辑器使用以达到较优的用户体验。

最后说一下数据代理模型,qt原生提供的就两个实例(QIdenityProxyModel/QSortFilterProxyModel),前者是唯一索引代理,后者是排序筛选代理,前者可能sqlModel用的较多一点,后者其实更普遍,当表格需要排序时,筛选部分数据显示时即可使用后者,另,如果两者皆不满足需求,我们可以直接继承QAbstractProxyModel实现自己的proxyModel。

笔者最近就是有一个多view使用同一个Model的情景。使用ProxyModel即可优雅的解决。各个view通过设置各自的QSortFilterProxyModel即可,而各ProxyModel只需setSourceModel成同一个Model即可。某个view对model数据更改后,只需

emit m_model->dataChanged(index,index);

即可同步所有的view更新。注意,更新时,如果有selectionModel该selectionModel是不会立马更新的,通过继承图可以看到selectionModel也是独立的。所以如果我们需要更新view的选择项,可以执行这句:

view->selectionModel()->clear();//清除选中项

这样就间接的更新了选中项了,qt的选中项作为一个独立模块,当我们需要遍历列表中所有选中项的时候也是需要先拿到selectionModel对象的,代码是:view->selectionModel().然后就可以用该对象获取selectedRows()/selectionIndexs()等函数了。

猜你喜欢

转载自blog.csdn.net/evil_119/article/details/82908722
今日推荐