Qt的Model/view模式

本文深入探讨了Model-View-Controller(MVC)设计模式的原理与应用,详细讲解了MVC如何通过解耦提高用户界面设计的灵活性与适用性。同时,文章介绍了Qt框架下MVC的演变——Model/View模式,以及各种模型、视图和委托的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Model-View-Controller(MVC),是从Smalltalk发展而来的一种设计模式,常被用于构建用户界面。
MVC由三种对象组成,Model是应用程序对象,View是它的屏幕显示,Controller定义了用户界面如何如何对用户输入进行响应,在MVC之前,用户界面设计倾向于混合设计,MVC的出现对它们进行了解耦,提高了灵活性与适用性。
Qt将View与Controller结合在一起,形成Model/View模式,该模式相对MVC更简单一些,同时,引入了delegate(委托),使得数据项的渲染与编程可定制。
其中,Model用于访问底层数据,为其他组件访问存储的数据提供接口,视图View通过model->Index来获取底层数据,并将数据绘制到窗体上,委托delegate是在View需要编辑的时候提供一种自定义编辑方式,比如限制只允许输入数字等。
如下图所示:
MVC关系
Model与数据通信,并提供接口给结构中别的组件使用。Model、View、Delegate三者之间通过信号槽机制来实现交互:
由Model发出的信号通知View底层数据发生了改变;
由View发出的信号提供了用户与被显示的数据项之间的交互;
由Delegate发出的信号在编辑某个界面元素时被发出,通知Model与View当前元素的状态。

Models

所有的item models都基于QAbstractItemModel类,该类为item模型提供了一个抽象接口,定义了item模型一定能用于与model/view结构的其他组件进行交互操作的标准化接口;该类不支持被实例化,需要将其子类化来创建新模型。
如果需要一个模型用于项目视图,如QML的ListView元素,或C++小部件QListView或QTableView,需要子类化QAbstractListModel或QAbstractTableModel,而不是该类。
另,QStringListModel用于存储简单的QString列表。
QStandardItemModel管理复杂的树形数据结构,每项可包含任意数据项。
QDirModel存储文件目录信息,以及QSqlQueryModel,QSqlTableModel、QSqlRelationTableModel用来访问管理数据库。

底层数据模型作为表层次结构公开给视图和委托,如果不使用层次结构,model是行与列的简单表,每个item都有一个由QModelIndex指定的唯一索引。
索引
子类
当标准的model无法满足需求时,可以子类化QAbstractItemModel、QAbstractListModel、QAbstractTableModel来定制。
在子类化QAbstractItemModel时,至少必须实现index()、parent()、rowCount()、ColumnCount()和data(),这些函数用于所有只读模型,并构成可编辑模型的基础。

View

QAbstractItemView为items view类提供基础功能。
其子类有:
| QColumnView | 列视图的Model/View实现 |
| QHeaderView | 提供了一个标题行或列的item view |
| QListView | 列表view |
| QTableView | 表格View |
| QTreeView | 树形VIew |
如果不满足需求,可以自定义子类化,也可以对它的子类再子类化定制。

delegate

QAbstractItemDelegate是Model/View架构中的用于delegate的抽象基类,用于显示和编辑来自model的item。
子类有:QItemDelegate和QStyledItemDelegate。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值