QModelIndex
一、描述
此类用作从 QAbstractItemModel 派生的项目模型的索引。项目视图、委托、选择模型使用索引来定位模型中的项目。
模型使用 QAbstractItemModel::createIndex() 函数创建新的 QModelIndex 对象。可以使用 QModelIndex 构造函数构造无效的模型索引。在引用模型中的顶级项目时,无效索引通常用作父索引。
模型索引是指模型中的项目,并包含指定它们在这些模型中的位置所需的所有信息。每个索引位于给定的行和列中,并且可能有一个父索引;使用 row()、column() 和 parent() 获取此信息。
模型中的每个顶级项目都由一个没有父索引的模型索引表示。在这种情况下, parent() 将返回一个无效的模型索引(QModelIndex() )。
要获取引用模型中现有项目的模型索引,请使用所需的行和列值以及父项的模型索引调用 QAbstractItemModel::index()。
model() 函数返回索引作为 QAbstractItemModel 引用的模型。
child() 函数用于检查模型中索引下的项目。
sibling()函数在与索引相同的级别上遍历模型中的项目。
注意:模型索引应立即使用,然后丢弃。在调用更改模型结构或删除项目的模型函数后,不应依赖索引来保持有效。如果需要随着时间的推移保留模型索引,请使用 QPersistentModelIndex。
二、成员函数
1、QModelIndex()
创建一个新的空模型索引。这种类型的模型索引用于指示模型中的位置无效。
2、int column() / int row()
返回此模型索引所指的列 / 行。
3、const void * constInternalPointer() / void * internalPointer()
返回模型用于将索引与内部数据结构关联的 const void * 指针 / void * 指针。
4、QVariant data(int role = Qt::DisplayRole)
返回索引引用的项目的给定角色的数据。
5、Qt::ItemFlags flags()
返回索引引用的项目的标志。
6、bool isValid()
此模型索引是否有效。有效索引属于模型,并且具有非负的行号和列号。
7、const QAbstractItemModel * model()
返回一个指向包含该索引所指项目的模型的指针。
8、void multiData(QModelRoleDataSpan roleDataSpan)
为索引引用的项目填充 roleDataSpan。
9、QModelIndex parent()
返回模型索引的父级,如果没有父级,则返回 QModelIndex()。
10、QModelIndex sibling(int row, int column)
返回row和column的同级。如果此位置没有同级,则返回 QModelIndex()。
11、QModelIndex siblingAtColumn(int column) / QModelIndex siblingAtRow(int row)
返回column / row的同级。
QPersistentModelIndex
一、描述
QPersistentModelIndex 继承自QModelIndex。与 QModelIndex 类不同,存储 QPersistentModelIndex 是安全的,因为模型将确保对项目的引用将继续有效,只要它们可以被模型访问。
注意:不能在模型的项目中存储 QStandardItemModel 的 QPersistentModelIndex。
QModelRoleData
一、描述
QModelRoleData 对象存储项目角色(它是来自 Qt::ItemDataRole 枚举的值,或自定义角色的任意整数)以及与该角色关联的数据。
QModelRoleData 对象通常由视图或委托创建,设置他们想要为哪个角色获取数据。然后将该对象传递给模型,该模型填充与存储的角色对应的数据。 最后,视图可视化从模型中检索到的数据。
二、成员函数
1、QModelRoleData(int role)
为给定的角色构造一个 QModelRoleData 对象。
2、void clearData()
清除此对象持有的数据。注意角色不变,只清除数据。
3、QVariant & data() / const QVariant & data()
返回此对象持有的数据引用。
4、int role()
返回此对象所拥有的角色。
5、template <typename T> void setData(T &&value)
将此对象持有的数据设置为值。value 必须是可以存储在 QVariant 中的数据类型。
QModelRoleDataSpan
一、描述
QModelRoleDataSpan 用作 QModelRoleData 对象数组的抽象。
QModelRoleDataSpan 可以从任何类似数组的序列(普通数组、QVector、std::vector、QVarLengthArray 等)构建。
QModelRoleDataSpan 的主要作用是使模型可以在一次调用中返回对应于不同角色的数据。
为了从模型中绘制一个元素,视图(通过其委托)通常会根据需要多次调用 data() 来为同一索引请求多个角色:
QVariant text = model->data(index, Qt::DisplayRole);
QVariant decoration = model->data(index, Qt::DecorationRole);
QVariant checkState = model->data(index, Qt::CheckStateRole);
QModelRoleDataSpan 允许视图仅使用一个函数调用来请求相同的数据。这是通过让视图准备一个合适的 QModelRoleData 对象数组来实现的,每个对象都使用应该获取的角色进行初始化。 然后将数组包装在 QModelRoleDataSpan 对象中,然后将其传递给模型的 multiData() 函数。
std::array<QModelRoleData, 3> roleData = { {
QModelRoleData(Qt::DisplayRole),
QModelRoleData(Qt::DecorationRole),
QModelRoleData(Qt::CheckStateRole)
} };
QModelRoleDataSpan span(roleData);
model->multiData(index, span);
//调用roleData[0].data(), roleData[1].data(),
模型会调用:QAbstractItemModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan)填充数据。
成员函数略。