QAbstractTableModel ------ Model-View-Control(MVC)架构(3)

QAbstractTableModel类提供一个抽象的模型,可以被子类化来创建表格模型。它继承自QAbstractItemModel。

QAbstractTableModel类提供了一个抽象接口,在该类中数据被表示为一个二维的阵列。这个类不能直接使用,要子类化它。


子类化QAbstractTableModel类

子类化QAbstractTableModel类时,必须要实现这3个函数:rowCount(),columnCount()和data()。index()和parent()函数由QAbstractTableModel类默认实现了。表现良好的模型还应该实现headerData()。

可编辑的模型还应实现setData(),还要实现flags()函数,来返回一个包含Qt::ItemIsEditable的值。

本模型还提供了接口可以改变数据大小,有以下函数的实现:insertRows(),removeRows(),insertColumns()和removeColumns()。在实现这些函数时,在必要时调用合适的函数,才能让与本模型相连接的视图知道数据发生了哪些变化。

1、insertRows()的实现。在向数据结构里插入新行时,必须先调用beginInsertRows()函数,之后必须立即调用endInsertRows()函数。

2、insertColumns()的实现。在向数据结构里插入新列时,必须先调用beginInsertColumns()函数,之后必须立即调用endInsertColumns()函数。

3、removeRows()的实现。在从数据结构里删除行时,必须先调用beginRemoveRows()函数,之后必须立即调用endRemoveRows()函数。

4、removeColumns()的实现。在从数据结构里删除列时,必须先调用beginRemoveColumns()函数,之后必须立即调用endRemoveColumns()函数。

模型子类化时的原则:

模型子类化时要提供基类QAbstractItemModel中定义的各个虚函数的实现。具体要实现的虚函数的数目取决于采用的是什么类型的模型:是简单的列表,一个表格,还是具有层次结构的条目。使用QAbstractListModel和QAbstractTableModel模型可以得益于这些类自身已经默认代为实现了一些虚函数。提供树形结构的模型,就必须要自己实现QAbstractItemModel定义的许多虚函数。

在一个模型子类里需要实现的虚函数可以概括为以下三类:

1、处理条目数据:所有模型都需要实现这些函数,以便让视图和代理/委托能查询模型的数据大小,检查条目,和获得数据。

2、导航和创建索引:有层次结构的模型需要提供函数给视图调用,让视图可以在模型提供的树形数据里导航,还有位条目提供所需的模型索引。

3、拖放支持和MIME类型处理:模型继承了一些控制内部或者外部拖放动作的函数。这些函数让数据的条目可以被描述为MIME类型,这样其他组件和应用程序才能够理解。

只读模型必须实现以下函数:

flalgs()

data()

headerData()

rowCount()

这4个函数在所有类型的模型里都要实现,包括列表模型(QAbstractListModel的子类)和表格模型(QAbstractTableModel的子类)。

此外,QAbstractTableModel和QAbstractItemModel的子类中,还必须实现以下函数:columnCount()。

可编辑的模型:

可编辑的模型运行数据被修改,也提供函数来插入或者删除数据行、列。要想实现编辑功能,必须实现以下函数:

flags()

setData()

setHeaderData()

可改变数据尺寸的模型:

所有类型的模型都支持插入和删除数据行。列表模型和有层次的数据模型还支持插入和删除数据列。当数据的尺寸大小发生变化时,在发生变化前后后,一定要通知其他组件这种改变。必须要实现以下函数。

insertRows()

removeRows()

insertColumns()

removeColumns()


你可能感兴趣的:(mvc,视图,模型,qt5)