QModelRoleDataSpan 类
QModelRoleDataSpan 类提供了对 QModelRoleData 对象的跨度。 更多...
头文件 | #include <QModelRoleDataSpan> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
自 | Qt 6.0 |
公共函数
QModelRoleDataSpan() | |
QModelRoleDataSpan(QModelRoleData &modelRoleData) | |
QModelRoleDataSpan(QModelRoleData *modelRoleData, qsizetype len) | |
QModelRoleDataSpan(Container &c) | |
QModelRoleData * | begin() const |
QModelRoleData * | data() const |
QVariant * | dataForRole(int role) const |
QModelRoleData * | end() const |
qsizetype | length() const |
qsizetype | size() const |
QModelRoleData & | operator[](qsizetype index) const |
详细描述
QModelRoleDataSpan 用于对数组 QModelRoleData 对象的抽象。
类似于查看器,QModelRoleDataSpan 提供了一个小的对象(指针和大小),可以传递给需要检查数组内容的函数。QModelRoleDataSpan 可以从任何类似数组的序列(原始数组、QVector、std::vector、QVarLengthArray 等)构造。此外,它不拥有该序列,因此必须延长引用它的任何 QModelRoleDataSpan 对象的生命周期。
与查看器不同,QModelRoleDataSpan 是一个跨度,因此它允许修改底层元素。
QModelRoleDataSpan 的主要用例是使模型能够在一次调用中返回对应不同角色的数据。
为了从一个模型中绘制一个元素,查看器(通过其代理)通常会通过多次调用 data()
需要的次数来请求相同索引的多个角色
QVariant text = model->data(index, Qt::DisplayRole); QVariant decoration = model->data(index, Qt::DecorationRole); QVariant checkState = model->data(index, Qt::CheckStateRole); // etc.
QModelRoleDataSpan 允许查看器使用单个函数调用请求相同的数据。
这是通过查看器准备一个合适的 QModelRoleData 对象数组来实现的,每个都初始化为应该检索的角色。然后,这个数组被包裹在一个 QModelRoleDataSpan 对象中,然后传递给模型的 multiData()
函数。
std::array<QModelRoleData, 3> roleData = { { QModelRoleData(Qt::DisplayRole), QModelRoleData(Qt::DecorationRole), QModelRoleData(Qt::CheckStateRole) } }; // Usually, this is not necessary: A QModelRoleDataSpan // will be built automatically for you when passing an array-like // container to multiData(). QModelRoleDataSpan span(roleData); model->multiData(index, span); // Use roleData[0].data(), roleData[1].data(), etc.
鼓励视图存储QModelRoleData对象的数组(以及可能的相应跨度)并在对模型的后续调用中重用它。这可以减少与创建和返回QVariant对象相关的内存分配。
最后,给定一个QModelRoleDataSpan对象,模型的职责是为跨度中的每个角色填写相应的数据。如何实现取决于具体的模型类。下面是一个迭代跨度的可能实现示例,该示例使用每个元素的setData()
。
void MyModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const { for (QModelRoleData &roleData : roleDataSpan) { int role = roleData.role(); // ... obtain the data for index and role ... roleData.setData(result); } }
另请参阅模型/视图编程和QAbstractItemModel::multiData。
成员函数说明
[constexpr noexcept]
QModelRoleDataSpan::QModelRoleDataSpan()
构建一个空的QModelRoleDataSpan。它的data()将被设置为nullptr
,其长度为0。
[constexpr noexcept]
QModelRoleDataSpan::QModelRoleDataSpan(QModelRoleData &modelRoleData)
构建一个跨越modelRoleData的QModelRoleDataSpan,将其视作一个包含1个元素的数组。
[constexpr]
QModelRoleDataSpan::QModelRoleDataSpan(QModelRoleData *modelRoleData, qsizetype len)
构建一个从modelRoleData开始长度为len的QModelRoleDataSpan。
注意:该数组必须在此对象被销毁之前保持活跃。
[constexpr noexcept(...)]
模板 <typename Container, QModelRoleDataSpan::if_compatible_container<Container> = true> QModelRoleDataSpan::QModelRoleDataSpan(Container &c)
构建一个覆盖容器c的QModelRoleDataSpan,其中可以是以QModelRoleData对象连续容器。例如,它可以是QVector<QModelRoleData>
、std::array<QModelRoleData, 10>
等。
注意:容器必须在此对象被销毁之前保持活跃。
注意:当"noexcept(std::data(c)) && noexcept(std::size(c))"为真时,此函数不会抛出任何异常。
[constexpr noexcept]
QModelRoleData *QModelRoleDataSpan::begin() const
返回此对象表示的跨度的起始指针。
[constexpr noexcept]
QModelRoleData *QModelRoleDataSpan::data() const
返回此对象表示的跨度的起始指针。
[constexpr]
QVariant *QModelRoleDataSpan::dataForRole(int role) const
返回与跨度中第一个具有指定role的QModelRoleData对象关联的数据。如果不存在这样的QModelRoleData对象,行为是未定义的。
注意:请勿从模型方面调用此函数,因为模型无法事先知道给定的QModelRoleDataSpan中包含哪些角色。此函数适用于视图和委托,它们可以控制跨度中的角色。
另请参阅:QModelRoleData::data()。
[constexpr noexcept]
QModelRoleData *QModelRoleDataSpan::end() const
返回指向此对象表示的跨度中“虚构”元素后一个元素的指针。
[constexpr noexcept]
qsizetype QModelRoleDataSpan::length() const
返回此对象表示的跨度的长度。
[constexpr]
qsizetype QModelRoleDataSpan::size() const
返回此对象表示的跨度的长度。
[constexpr]
QModelRoleData &QModelRoleDataSpan::operator[](qsizetype index) const
返回对跨度中位置 index 的 QModelRoleData 的可修改引用。
注意:index 必须是该跨度的有效索引(0 <= index < size())。
© 2024 The Qt Company Ltd. 本文档中的文档贡献均属于其各自所有者的版权。本提供的文档是根据自由软件基金会发布的 GNU自由文档许可版1.3 的条款许可的。Qt及其相关标志是The Qt Company Ltd.在芬兰和其他国家/地区的商标。所有其他商标均为其各自所有者的财产。