本文将针对Qt中的Model/View结构进行介绍。
Model/View结构
Qt通过Model/View实现了数据与接口的分离,降低了耦合性,在该结构中:
- View是前端,是用于展示、编辑数据的可视化组件
- Model是后端,是视图与原始数据的接口
Model/View的一个典型应用是数据库应用,例如将数据库中一个页在view中进行展示与编辑。Model/View基本结构如下图所示:
图中还有一个代理环节,可以方便用户定制数据的显示方式和编辑方式。
Model/View在Qt中的实现
Model
基于项数据(item data)的数据模型(Model)都是基于QAbstractItemModel类,该类定义了两个主要部件:
- 视图组件:用于显示
- 数据处理接口:用于数据存取
根据数据结构的不同,Qt提供了若干模型类,其层次结构如下图。
其中的抽象类不能直接使用,如果里面的模型类无法实现,我们可以基于抽象类构建自己的Model
View
自定义Model
QAbstractTableModel使用2
这里以QAbstractTableModel为例,介绍如何自定义Model
源文件
- main.cpp
1 |
|
- currencymodel.h
1 |
|
- currencymodel.cpp
1 |
|
注意:在上面的代码中,headerData函数是必须实质性实现的,否则运行时会抛出std::bad_alloc导致异常。具体原因在view的setModel函数中,这里不深究了,总之要将这个函数实质性实现