本页内容

QRangeModel::ItemAccess Struct

template <typename T> struct QRangeModel::ItemAccess

ItemAccess 模板提供了一个自定义点,用于控制 `QRangeModel ` 如何访问单个项的角色数据。更多内容...

该结构体于 Qt 6.11 中引入。

静态公共成员

(since 6.12) bool canDropMimeData(const QMimeData *data)
(since 6.12) bool canDropMimeData(const QMimeData *data, int action, int row, int column, const QModelIndex &parent)
(since 6.12) auto dropMimeData(const QMimeData *data, auto inserter)
(since 6.12) auto dropMimeData(const QMimeData *data, int action, int row, int column, const QModelIndex &parent, auto inserter)
(since 6.12) Qt::ItemFlags flags(const T &item)
(since 6.12) QMimeData *mimeData(const QModelIndex &range)
(since 6.12) QMimeData *mimeData(const auto &range)
(since 6.12) QStringList mimeTypes()
QVariant readRole(const T &item, int role)
bool writeRole(T &item, const QVariant &value, int role)

详细说明

ItemAccess<T> 是一个结构体模板,其中 `T ` 指定了项的类型。请针对您数据结构中使用的类型对该模板进行特化,并实现相关的类成员函数。

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static Qt::ItemFlags flags(const ColorEntry &entry)
    {
        return entry.flags();
    }
    static QVariant readRole(const ColorEntry &entry, int role)
    {
        switch (role) {
            // ...
        }
        return {};
    }
    static bool writeRole(ColorEntry &entry, const QVariant &value, int role)
    {
        bool ok = false;
        switch (role) {
            // ...
        }
        return ok;
    }
    ...
};

此类特化将优先于任何预定义行为,并优先于RowOptions 的相应特化。

注意:请 勿针对您不拥有的类型对该模板进行特化。

成员函数文档

[static, since 6.12] bool ItemAccess::canDropMimeData(const QMimeData *data)

[static, since 6.12] bool ItemAccess::canDropMimeData(const QMimeData *data, int action, int row, int column, const QModelIndex &parent)

实现以下其中一个类成员,以返回data 是否可以拖放到模型中。如果实现了简化版本,则QRangeModel 将验证action 是否属于supported drop actions 。在完整版本中,实现可以根据row 、column 和parent 指定的拖放位置返回不同的结果。

此成员为可选,并非拖放自定义的必备条件。默认行为用于判断data 是否包含支持的 MIME 类型之一。

注意: 仅当模型中的所有项目均由T 类型的项目支持时,才会考虑此 特化。对于不同列提供不同数据类型的异构模型,请改用RowOptions 进行特化。

这些函数在 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::canDropMimeData()。

[static, since 6.12] template <typename inserter:auto> auto ItemAccess::dropMimeData(const QMimeData *data, auto inserter)

[static, since 6.12] template <typename inserter:auto> auto ItemAccess::dropMimeData(const QMimeData *data, int action, int row, int column, const QModelIndex &parent, auto inserter)

实现以下类成员之一,将data 中的相关条目解码为T 类型的项目序列,并通过将每个项目分配给提供的inserter ,将这些行导入模型。返回操作是否成功。

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static bool dropMimeData(const QMimeData *mimeData, auto inserter)
    {
        QByteArray data = mimeData->data(mimeTypes().first());
        if (data.isEmpty())
            return false;
        QTextStream stream(&data, QIODevice::ReadOnly);
        while (!stream.atEnd()) {
            QString colorName;
            stream >> colorName;
            inserter = ColorEntry(colorName);
        }
        return true;
    }
};

可选地,解码后的项可以与相对于放置位置的行和列值配对。如果 MIME 数据包含位置信息,则可以借此保持项的“形状”。

for (const auto &decodedItem: decodedItems) {
    inserter = {
        decodedItem,
        {
            relativeRow,
            relativeColumn
        }
    };
}

实现包含action 、row 、column 和parent 参数的版本,以对操作进行完全控制。

返回DropOperation 的其中一个值,以向QRangeModel 提供提示,说明应如何将删除的行应用到模型中。或者,只需返回true (等同于DropOperation::Automatic )或false (等同于DropOperation::DontDrop )。

注意: 仅当模型中的所有项均由类型为T 的项支持时,才会考虑此 特化。对于不同列提供不同数据类型的异构模型,请改用RowOptions 进行特化。

这些函数在 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::dropMimeData()。

[static, since 6.12] Qt::ItemFlags ItemAccess::flags(const T &item)

实现该类成员,使其在item 时返回flags 。

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static Qt::ItemFlags flags(const ColorEntry &entry)
    {
        return entry.flags();
    }
};

该函数在 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::flags()。

[static, since 6.12] QMimeData *ItemAccess::mimeData(const QModelIndex &range)

[static, since 6.12] template <typename range:auto> QMimeData *ItemAccess::mimeData(const auto &range)

实现以下类成员之一,以返回所提供range 中各项的mime data 。

如果提供了泛型版本,则range 的迭代器是双向的,且解引用后将指向一个元组,该元组包含类型为T 的项及其对应的QModelIndex 。

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static QMimeData *mimeData(const auto &range)
    {
        QByteArray data;
        QTextStream stream(&data, QIODevice::WriteOnly);
        for (const auto &[item, index] : range)
            stream << item.colorName() << Qt::endl;

        QMimeData *result = new QMimeData;
        result->setData(mimeTypes().first(), data);
        // Qt handles encoding into the default mime type
        return result;
    }
};

range 中的条目按逻辑顺序排序,从最顶行到最后一行,从最左列到最后一列。

注意: 仅当模型中的所有项均由T 类型的项支持时,才会考虑此 特化。对于不同列提供不同数据类型的异构模型,请改用RowOptions 进行特化。

这些函数首次出现在 Qt 6.12 中。

另请参阅 QAbstractItemModel::mimeData()。

[static, since 6.12] QStringList ItemAccess::mimeTypes()

实现此类成员,以返回mime types 列表,该列表可供存储T 类型项的模型在拖放操作期间用于表示模型数据。

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static QStringList mimeTypes()
    {
        return {
            u"text/plain"_s,
            u"application/x-qabstractitemmodeldatalist"_s
        };
    }
};

如果该列表包含 Qt XML 用于拖放数据的default mime type ,则QRangeModel 将自动处理该 MIME 类型的数据编码和解码。

注意: 仅当模型中的所有项均由T 类型的项支持时,才会考虑此 特化。对于不同列提供不同数据类型的异构模型,请改用特化RowOptions 函数。

该函数于 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::mimeTypes()。

[static] QVariant ItemAccess::readRole(const T &item, int role)

实现此类成员,以返回请求的role 在item 中的数据。

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static QVariant readRole(const ColorEntry &entry, int role)
    {
        switch (role) {
            // ...
        }
        return {};
    }
};

对于已通过readRole 实现对ItemAccess 进行特化的类型,将被隐式解释为multi-role items 。

另请参阅 QAbstractItemModel::data()。

[static] bool ItemAccess::writeRole(T &item, const QVariant &value, int role)

实现此类成员,用于将请求的role 对应的item 数据设置为提供的value ,并返回更改是否成功。

template <>
struct QRangeModel::ItemAccess<ColorEntry>
{
    static bool writeRole(ColorEntry &entry, const QVariant &value, int role)
    {
        bool ok = false;
        switch (role) {
            // ...
        }
        return ok;
    }
};

另请参阅 QAbstractItemModel::setData()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.