Qt模型视图框架:QModelIndex、QPersistentModelIndex、QModelRoleData、QModelRoleDataSpan

QModelIndex是Qt中用于表示数据模型中项的引用,它包含了项的位置信息(行、列)和父索引。QPersistentModelIndex保证了对模型项目的引用在一段时间内有效。QModelRoleData用于获取项目特定角色的数据,而QModelRoleDataSpan允许模型一次性返回多个角色的数据。这些类在数据视图和模型之间的交互中起到关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)填充数据。

成员函数略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值