0. 简介
QAbstractItemModel
是Qt
框架中的一个核心类,用于实现数据模型的抽象接口。它定义了一组纯虚函数,派生类需要实现这些函数来提供具体的数据访问和操作方法。QAbstractItemModel
的主要作用是将数据与视图分离,实现了数据模型和视图之间的解耦,使得数据的展示和操作更加灵活和可扩展。Model-View
架构是一种常见的软件设计模式,用于将数据和显示分离,使得数据的修改不影响视图的显示,反之亦然。
1. QAbstractItemModel
功能
- 数据存储:
QAbstractItemModel
允许存储和组织数据,可以是单个值或复杂的数据结构。 - 数据索引:每个数据项在模型中都有一个唯一的索引,可以使用QModelIndex来访问和操作特定项,也提供了方法来根据索引获取和设置特定项的数据。
- 数据变更通知:当模型中的数据发生变化时,
QAbstractItemModel
可以发送信号来通知视图组件更新显示。 - 数据操作:支持对数据模型进行插入、删除、移动等操作。
- 视图更新:提供了方法来通知视图组件在数据模型变化后进行更新。
1.1 使用
为了创建自定义的数据模型,需要继承QAbstractItemModel
类,并实现以下关键的虚函数:
int rowCount(const QModelIndex &parent = QModelIndex()) const
parent
参数表示要查询子项数量的父项的索引。默认值为一个无效索引,表示查询顶层项的数量。- 这个函数用于获取指定父项下的子项数量。在实现这个函数时,需要根据父项的索引来确定子项的数量,通常是遍历父项下的所有子项并计数。
int columnCount(const QModelIndex &parent = QModelIndex()) const
parent
参数表示要查询列数的父项的索引。默认值为一个无效索引,表示查询顶层项的列数。- 这个函数用于获取指定父项下的列数。与
rowCount()
类似,需要根据父项的索引来确定列数,通常是根据数据模型的设计来决定。
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
index
参数表示要获取数据的索引,role
参数表示数据的角色,默认为Qt::DisplayRole
。- 这个函数用于获取给定索引处的数据。在实现这个函数时,需要根据索引和角色来确定返回的数据,角色通常用于区分不同的数据表示方式,比如显示文本、编辑文本等。
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const
row
和column
参数表示要获取索引的行号和列号,parent
参数表示索引的父项。- 这个函数用于根据行号、列号和父项来创建索引。在实现这个函数时,需要将这些参数组合成一个唯一的索引(使用
createIndex
函数),以便其他函数可以使用。
QModelIndex parent(const QModelIndex &index) const
index
参数表示要获取父项的索引。- 这个函数用于获取给定索引的父项索引。在实现这个函数时,需要根据索引来确定父项的索引,通常是根据数据组织结构来决定。
Qt::ItemFlags flags(const QModelIndex &index) const
index
参数表示要获取标志位的索引。- 这个函数用于确定给定索引处的项的行为标志。在实现这个函数时,需要根据索引来确定项的行为标志,通常是根据数据的可编辑性、可选择性等来决定。
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
index
参数表示要设置数据的索引,value
参数表示要设置的数据值,role
参数表示数据的角色,默认为Qt::EditRole
。- 这个函数用于设置给定索引处的数据值。在实现这个函数时,需要根据索引、角色和值来确定如何更新数据,通常是将新值保存到数据模型中。
QModelIndex QAbstractItemModel::createIndex(int row, int column, void *ptr = nullptr) const
- 这个函数用于创建一个新的
QModelIndex
,它需要行、列和一个内部标识符。这个内部标识符通常是一个指向模型中某个项的指针。 - 当重写
index()
和parent()
方法时,通常在QAbstractItemModel
的子类中使用createIndex()
。因为QModelIndex
的构造函数是私有的,所以必须使用createIndex()
来创建一个新的索引。
- 这个函数用于创建一个新的
这些函数共同构成了QAbstractItemModel
的核心接口,通过实现这些函数,可以创建自定义的数据模型,并与Qt
的视图组件进行交互。在实现这些函数时,需要根据数据模型的特点和业务逻辑来确定具体的实现方式。
1.2 举个例子
#include <QAbstractItemModel>
#include <QModelIndex>
#include