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()