QModelRoleDataSpan 类

QModelRoleDataSpan 类提供了对 QModelRoleData 对象的跨度。 更多...

头文件 #include <QModelRoleDataSpan>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += 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
qsizetypelength() const
qsizetypesize() 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

返回与跨度中第一个具有指定roleQModelRoleData对象关联的数据。如果不存在这样的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

返回对跨度中位置 indexQModelRoleData 的可修改引用。

注意:index 必须是该跨度的有效索引(0 <= index < size())。

© 2024 The Qt Company Ltd. 本文档中的文档贡献均属于其各自所有者的版权。本提供的文档是根据自由软件基金会发布的 GNU自由文档许可版1.3 的条款许可的。Qt及其相关标志是The Qt Company Ltd.在芬兰和其他国家/地区的商标。所有其他商标均为其各自所有者的财产。