模型的子类需要提供很多在QAbstractItemModel中定义的虚函数的实现。需要实现的方法的数量取决于你想创建的子类的风格——它提供一个简单的列表视图,还是一个表格视图,或者是一个复杂的层次视图。从QAbstractListModel和QAbstractTableModel继承的子类可以直接利用这两个类的许多默认的虚函数。
子类中需要实现的方法可以分为三种:
1. 处理项数据:所有的模型需要实现方法来保证视图和委托能够查询模型的尺寸、检测每个项以及返回其中的数据。
2. 浏览和创建索引:具有层次关系的模型需要实现方法来使得视图可以调用它们来它们公开的树形结构,并获得每个项的模型索引。
3. 支持拖拽操作和处理MIME类型数据:模型继承方法来控制内部和外部的拖拽行为的实现方式。这些方法允许项数据被描述为其他的组件和应用能够接受的MIME类型。
项数据管理
对于模型中的数据,模型可以提供多种等级的访问:只读, 调整大小和编辑。
只读访问
一个模型如果想实现对数据的只读访问,这些方法必须被子类实现:
Flags():这个方法被其他的组件使用来获得该模型的每个项数据的信息。标志位的组合应当包括Qt::ItemIsEnabled和Qt::ItemIsSelectable。
Data():用来把项数据提供给视图和委托。一般地,模型只需要为Qt::DisplayRole和其他的特定应用的用户角色。但是把数据提供给Qt::ToolTipRole和Qt::AccessibleTextRole和Qt::AccessibleDescriptionRole同样是很好的选择。请参阅Qt::ItemDataRole枚举值手册来获取与每个角色有关的类型的信息。
headerData():提供能显示标头信息的视图。能够显示标头信息的视图才能得到这些信息。
rowCount():提供模型公开的数据的行数。
这4个方法在任何类型的模型中(包括列表模型,即QAbstractListModel及其子类,和表格模型,即QAbstractTableModel及其子类)都必须被实现。
另外,以下的方法必须在QAbstractTableModel和QAbstractItemModel的直接子类中实现:
columnCount():提供模型公开的数据的列数,列表模型不需要提供它的实现因为它已经在QAbstractListModel中实现了。
可编辑项
可编辑模型允许项数据被更改,也可以提供方法来插入或者删除行和列。要使能编辑功能,以下这些方法必须被正确实现:
Flags():必须为每个项返回正确的标识位组合。特别地,除了提供给只读模型中的数据项的值以外,还必须包括Qt::ItemIsEditable。
setData():用来改变一个与特定的模型索引相联系的项的值。为了能够接受用户接口元素提供的用户输入,这个方法必须处理与Qt::EditRole相关联的数据。这个实现也可以接受与其他的Qt::EditRole值相关联的数据。在修改数据完成后,模型必须发射dataChanged()信号来通知其他的组件这里发生了改变。
setHeaderData():用来改变行或列的标头信息。在修改完成后,模型必须发射headerDataChanged()信号来通知其他的组件这里发生了改变。