本页内容

QRangeModel::RowOptions Struct

template <typename T> struct QRangeModel::RowOptions

RowOptions 模板提供了一个自定义点,用于控制 `QRangeModel ` 如何呈现用作行(row)的类型。更多内容...

该结构体在 Qt 6.10 中引入。

静态公共成员

(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 &row)
(since 6.12) QVariant headerData(int section, int role)
(since 6.12) QMimeData *mimeData(const QModelIndex &range)
(since 6.12) QMimeData *mimeData(const auto &range)
(since 6.12) QStringList mimeTypes()
const QRangeModel::RowCategory rowCategory

详细描述

RowOptions<T> 是一个结构体模板,其中T 指定行类型。请针对您范围中使用的类型对该模板进行特化,并添加相关成员。

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    ...
};

另请参阅 ItemAccess 。

成员函数文档

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

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

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

该成员为可选,并非拖放自定义的必要条件。默认行为是检查data 是否包含受支持的 MIME 类型之一。

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

另请参阅 QAbstractItemModel::canDropMimeData()。

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

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

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

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static bool dropMimeData(const QMimeData *mimeData, auto inserter)
    {
        const QByteArray data = mimeData->data(mimeTypes().first());
        if (data.isEmpty())
            return false;
        QXmlStreamReader stream(data);
        while (!stream.atEnd()) {
            stream.readNext();
            if (stream.isStartElement() && stream.name() == u"li"_s)
                inserter = ColorEntry(stream.readElementText());
        }

        return true;
    }
};

inserter 的行为类似于std::back_insert_iterator,可与std::copy 等一起使用。上述代码片段省略了错误处理,这可能需要将解码后的项存储在单独的列表中,以便在发生错误时将其丢弃。以下代码可高效地将解码后的行移入模型:

static bool dropMimeData(const QMimeData *mimeData, auto inserter)
{
    QList<ColorEntry> decodedEntries;
    // read stream and populate decodedEntries

    if (stream.hasError())
        return false;
    std::copy(std::move_iterator(decodedRows.begin()), std::move_iterator(decodedRows.end()),
                inserter);
    return true;
}

此外,还可以将解码后的行与其在插入行范围中应有的相对行号配对。

int row = 0;
for (const auto &decodedRow : decodedRows) {
    inserter = {decodedRow, row};
    row += 2;
}

此实现会在每行解码数据之间保留一行空行。

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

这些函数在 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::dropMimeData()。

[static, since 6.12] Qt::ItemFlags RowOptions::flags(const T &row)

实现此类成员,以返回row 中所有项的flags 。

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

这将被ItemAccess::flags 的自定义实现所覆盖。

如果未提供此成员,则QRangeModel 会根据其构建所基于的范围来计算标志。

该函数在 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::flags()。

[static, since 6.12] QVariant RowOptions::headerData(int section, int role)

实现此类成员,以返回QRangeModel 应为水平标题中section 的role 返回的标题数据。

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static QVariant headerData(int section, int role)
    {
        switch (section) {
            // ...
        }
        return {};
    }
};

如果未提供此成员,则QRangeModel 将从 headerData() 的实现中返回类型特定的默认值。

该函数在 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::headerData()。

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

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

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

如果提供了泛型版本,则range 的迭代器是双向的,解引用后将返回一个由T 类型行和对应的QModelIndex 组成的元组。

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    template <typename Items>
    static QMimeData *mimeData(const Items &items)
    {
        if (items.isEmpty())
            return nullptr;
        QByteArray data;
        QXmlStreamWriter stream(&data);
        stream.writeStartElement("ul");
        for (const auto &[item, index] : items)
            stream.writeTextElement("li", item.colorName());
        stream.writeEndElement();

        QMimeData *mimeData = new QMimeData;
        mimeData->setData(mimeTypes().first(), data);
        return mimeData;
    }
};
for (const auto &[row, index] : range) {
    // ...
}

完全选中的行将仅被包含在范围内一次,并配有一个index ,其中包含行号和父行,以及一列值为-1的列。部分选中的行将多次包含在范围内,每选中一列就包含一次。

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

这些函数在 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::mimeData()。

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

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

template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static QStringList mimeTypes()
    {
        return {
            u"text/html"_s
        };
    }
};

如果未提供此成员,则QRangeModel 将返回QAbstractItemModel 支持的默认 MIME 类型“application/x-qabstractitemmodeldatalist”。如果返回的列表中不包含该 MIME 类型,则该类型将不被支持。

该函数在 Qt 6.12 中引入。

另请参阅 QAbstractItemModel::mimeTypes()。

成员变量文档

const QRangeModel::RowCategory RowOptions::rowCategory

将此静态编译时常量设置为RowCategory 枚举中的某个值,以定义QRangeModel 应如何解释该范围的元素。未提供此常量等同于RowCategory::Default 。

class ColorEntry
{
    Q_GADGET
    Q_PROPERTY(QString display READ colorName)
    Q_PROPERTY(QColor decoration READ decoration)
    Q_PROPERTY(QString toolTip READ toolTip)
public:
    ...
};
template <>
struct QRangeModel::RowOptions<ColorEntry>
{
    static constexpr auto rowCategory = QRangeModel::RowCategory::MultiRoleItem;
};

如果将rowCategory 设置为MultiRoleItem ,则其他成员均不会产生任何效果。

另请参阅 ItemAccess 。

© 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.