在本页

QRangeModelAdapter Class

QRangeModelAdapter 提供对任何 C++ 范围的QAbstractItemModel 兼容访问。更多

头文件: #include <QRangeModelAdapter>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Qt 6.11
状态:初步

该类正在开发中,可能会有变动。

该类可等价比较

该类可与 Range 进行等价比较

公共函数

QRangeModelAdapter(Range &&range)
QRangeModelAdapter(Range &&range, Protocol &&protocol)
void assign(NewRange &&newRange)
void assign(std::initializer_list<Row> newRange)
void assign(InputIterator first, Sentinel last)
auto at(QSpan<const int> path)
auto at(int row)
auto at(int row)
auto at(int row)
decltype(auto) at(QSpan<const int> path) const
auto at(int row) const
decltype(auto) at(int row) const
auto at(QSpan<const int> path, int column)
auto at(int row, int column)
auto at(QSpan<const int> path, int column) const
auto at(int row, int column) const
int columnCount() const
QVariant data(int row) const
QVariant data(QSpan<const int> path, int column) const
QVariant data(int row, int role) const
QVariant data(int row, int column) const
QVariant data(QSpan<const int> path, int column, int role) const
QVariant data(int row, int column, int role) const
bool hasChildren(QSpan<const int> row) const
bool hasChildren(int row) const
QModelIndex index(int row) const
QModelIndex index(QSpan<const int> path, int column) const
QModelIndex index(int row, int column) const
bool insertColumn(int before)
bool insertColumn(int before, D &&data)
bool insertColumns(int before, C &&data)
bool insertRow(QSpan<const int> before)
bool insertRow(int before)
bool insertRow(QSpan<const int> before, D &&data)
bool insertRow(int before, D &&data)
bool insertRows(QSpan<const int> before, C &&data)
bool insertRows(int before, C &&data)
Model *model() const
bool moveColumn(int from, int to)
bool moveColumns(int from, int count, int to)
bool moveRow(QSpan<const int> source, QSpan<const int> destination)
bool moveRow(int source, int destination)
bool moveRows(QSpan<const int> source, int count, QSpan<const int> destination)
bool moveRows(int source, int count, int destination)
const QRangeModelAdapter<Range, Protocol, Model>::range_type &range() const
bool removeColumn(int column)
bool removeColumns(int column, int count)
bool removeRow(QSpan<const int> path)
bool removeRow(int row)
bool removeRows(QSpan<const int> path, int count)
bool removeRows(int row, int count)
int rowCount() const
int rowCount(QSpan<const int> row) const
int rowCount(int row) const
bool setData(int row, const QVariant &value, int role = Qt::EditRole)
bool setData(QSpan<const int> path, int column, const QVariant &value, int role = Qt::EditRole)
bool setData(int row, int column, const QVariant &value, int role = Qt::EditRole)
QRangeModelAdapter<Range, Protocol, Model> &operator=(NewRange &&newRange)
QRangeModelAdapter<Range, Protocol, Model> &operator=(std::initializer_list<Row> newRange)
auto operator[](QSpan<const int> path)
auto operator[](int row)
auto operator[](int row)
auto operator[](int row)
decltype(auto) operator[](QSpan<const int> path) const
auto operator[](int row) const
decltype(auto) operator[](int row) const

私有类型

bool operator!=(const QRangeModelAdapter<Range, Protocol, Model> &lhs, const QRangeModelAdapter<Range, Protocol, Model> &rhs)
bool operator==(const QRangeModelAdapter<Range, Protocol, Model> &lhs, const QRangeModelAdapter<Range, Protocol, Model> &rhs)

详细说明

QRangeModelAdapter 围绕 C++ 范围和QRangeModel 提供了一个类型安全且结构感知的 C++ API。使用该适配器对 C++ 范围所做的修改将通知QRangeModel 的客户端。这将确保项目视图得到更新、缓存得到清理、持久性项目索引失效并正确调整。

构造和模型所有权

QRangeModelAdapter 必须由 C++ 范围构建。与QRangeModel 一样,range 可以通过 lvalue 或 rvalue 引用、引用包装器、原始指针或智能指针提供。

std::vector<int> data = {1, 2, 3, 4, 5};
QRangeModelAdapter adapter(&data);

编译器会根据构造函数参数推导出所构造的确切类型,而值类别之间的差异会导致不同的行为。因此,不应明确指定模板参数。然而,C++ 不允许对非静态类数据成员进行类模板参数扣减。要使 QRangeModelAdapter 成为类的数据成员,请使用以下模式:

class Backend
{
    using Adapter = decltype(QRangeModelAdapter(std::vector<Book>{}));
    Adapter adapter = Adapter(std::vector<Book>{});

这将创建一个 QRangeModelAdapter,对未命名(即 r 值引用)的 Books 向量进行操作。如果要使适配器对图书列表的引用包装进行操作,请使用此模式:

    QList<Book> books = { /* ... */ };
    using Adapter = decltype(QRangeModelAdapter(std::ref(books)));
    Adapter adapter = Adapter(std::ref(books));
};

从一个范围构建适配器会隐式地从同一范围构建一个QRangeModel 实例。使用model() 获取该实例,然后像往常一样将其传递给Qt WidgetsQt Quick 项目视图。

QListView listView;
listView.setModel(adapter.model());

适配器拥有模型。QRangeModelAdapter 是一种值类型,因此可以复制和移动。所有副本共享相同的QRangeModel ,当适配器的最后一个副本被销毁时,它也将被销毁。

如果适配器是通过 lvalue 或 rvalue 引用创建的,那么适配器和模型将在原始范围对象的副本上运行。否则,通过适配器或模型进行的修改将写入原始范围对象。要访问更新后的范围,请使用range() :

QList<Book> books = {
    // ...
};
QRangeModelAdapter adapter(books);
tableView.setModel(adapter.model());

// show UI and where the user can modify the list

QList<Book> modifiedBooks = adapter.range();

要使用另一个(兼容)范围的数据替换整个范围数据,请使用assign() 函数或赋值操作符。

// reset to the original
adapter = books;
// or
adapter.assign(books);

访问项目数据

QRangeModelAdapter API 提供对模型操作范围的类型安全读写访问。适配器 API 基于 C++ 容器和范围(包括迭代器)的典型 API。要访问单个行和项,请使用at() 、相应的下标operator[]data() 。这些函数的哪些重载可用取决于适配器的构建范围。

以 QVariant 形式读取项目数据

data() 函数总是返回一个QVariant ,其中包含存储在指定位置和角色的值。在列表中,可以通过指定行的单个整数值访问项:

QVariant listItem = listAdapter.data(row);

如果范围是一个表,那么项是通过行和列指定的:

QVariant tableItem = tableAdapter.data(row, column);

如果范围是树形,则通过行路径和单列值来定位项目:

QVariant treeItem = treeAdapter.data({path, to, branch}, column);

使用单个整数作为行可以访问顶层树项。

QRangeModelAdapter listOfBooks(QList<Book>{
    // ~~~
});
QString bookTitle = listOfBooks.data(0, Book::TitleRole).toString();
Book multiRoleItem = listOfBooks.data(0).value<Book>();

如果没有指定角色,那么QVariant 将保存位置上的整个项目。使用QVariant::fromValue() 模板函数可以获取项目的副本。

使用 at() 进行读写

data() 函数会返回一个QVariant ,这使得该函数非常灵活,但也取消了类型安全性。对于所有项都是同一类型的范围,at() 函数提供了一种类型安全的替代方法,与常规的 C++ 容器更加兼容。与data() 函数一样,at() 函数也有重载功能,可以在列表的行处、表格的行/列对处以及树的路径/列对处访问项目。但是,at() 总是返回指定位置上的整个项目;无法读取项目的单个角色值。

正如 C++ 容器 API 所期望的那样,at() 的 const 重载(以及相应的下标operator[] )提供了对值的不可变访问,而可变重载则返回一个可分配新值的引用对象。请注意,在 const 范围上操作的 QRangeModelAdapter 在这方面的行为与 const QRangeModelAdapter 类似。可变重载会从重载集中移除,因此编译器将始终选择 const 版本。即使适配器本身是可变的,尝试调用修改范围的函数也会导致编译器错误:

const QStringList strings = {"On", "Off"};
QRangeModelAdapter adapter(strings);
adapter.at(0) = "Undecided"; // compile error: return value of 'at' is const
adapter.insertRow(0); // compiler error: requirements not satisfied

返回的引用对象是隐式转换为底层类型的包装器,它有一个get() 函数用于显式访问底层值,还有一个operator->() 用于直接访问 const 成员函数。不过,为了防止意外的数据更改绕过QAbstractItemModel 通知协议,这些引用对象阻止了对项目的直接修改。

注意: 访问引用对象时总是要调用模型来获取值的副本。这样做的代价可能很高;对于性能至关重要的数据访问,应存储一份副本。

项目访问

如果范围表示为列表,那么只有取一行的重载可用。

QRangeModelAdapter list(std::vector<int>{1, 2, 3, 4, 5});
listView.setModel(list.model());

int firstValue = list.at(0); // == 1
list.at(0) = -1;
list.at(1) = list.at(4);

const 重载会返回该行的项,而可变重载会返回一个封装器,该封装器会隐式地转换为列表的值类型。

QRangeModelAdapter books(QList<Book>{
    // ~~~
});
Book firstBook = books.at(0);
Book newBook = {};
books.at(0) = newBook; // dataChanged() emitted

给包装器赋值可修改列表中的数据。模型将为所有角色发出dataChanged() 。

使用可变重载时,还可以使用重载箭头操作符访问项类型的 const 成员。

QString title = books.at(0)->title();

不可能访问项目的非const 成员。这样的修改会绕过适配器,而适配器无法将修改通知模型。要修改存储在模型中的值,需要复制一个副本,修改副本的属性,然后写回副本。

// books.at(0)->setRating(5); - not possible even though 'books' is not const
firstBook = books.at(0);
firstBook.setRating(5);
books.at(0) = firstBook; // dataChanged() emitted

这将使模型对该项目和所有角色发出dataChanged() 命令。

如果范围用表格表示,那么可以使用at(row, column) 重载按行和列访问单个项。对于树,该重载可访问顶层项,而at(path, column) 重载可访问嵌套在树中的项。

访问表或树中的单个项等同于访问列表中的项。

QRangeModelAdapter table(std::vector<std::vector<double>>{
    {1.0, 2.0, 3.0, 4.0, 5.0},
    {6.0, 7.0, 8.0, 9.0, 10.0},
});
tableView.setModel(table.model());

double value = table.at(0, 2); // value == 3.0
table.at(0, 2) = value * 2; // table[0, 2] == 6.0

如果范围没有使用相同的数据类型存储所有列,那么at(row,column) 会返回一个(带有引用包装的)QVariant ,其中包含该项目。

QRangeModelAdapter table(std::vector<std::tuple<int, QString>>{
    // ~~~
});
int number = table.at(0, 0)->toInt();
QString text = table.at(0, 1)->toString();

访问表和树中的行

对于表格和树,at() 和下标operator[] 的重载无需列参数即可访问整行。const 重载返回的值将是一个引用类型,可以访问行数据。如果该行持有指针,那么该引用类型将是该行的视图,可以访问指向 const 项的指针。

表行访问

at(int) 重载仍然可用,但它会返回整个表 word。这样就可以一次性处理行中的所有值。

const auto &constTable = table;
const std::vector<double> &topRow = constTable.at(0);

与项一样,const 重载提供了对行类型的直接访问,而可变重载则返回一个包装器,作为对行的引用。包装器使用重载箭头操作符访问 const 成员函数。要修改值,请写回修改后的行类型。

auto lastRow = table.at(table.rowCount() - 1);
lastRow = { 6.5, 7.5, 8.0, 9.0, 10 }; // emits dataChanged() for entire row

在为行赋值时,模型会为行中的所有项和所有角色发出dataChanged() 信号。

注意: 当使用具有运行时大小的行类型(如std::vectorQList )时,请确保新行具有正确的大小。

树状行访问

树中的行由整数序列指定,树中每一级都有一个条目。请注意,在以下代码段中,树是一个包含原始行指针的范围,适配器是通过该范围的 rvalue 引用创建的。这样,QRangeModel 就拥有了行数据的所有权。

QRangeModelAdapter tree = QRangeModelAdapter(Tree{
    new TreeRow{"Germany", 357002, Tree{
            new TreeRow("Bavaria", 70550)
        },
    },
    new TreeRow{"France", 632702},
});
treeView.setModel(tree.model());

auto germanyData = tree.at(0);
auto bavariaData = tree.at({0, 0});

at() 的重载使用单个行值,可访问顶层行或顶层行中的项目。

auto germanyName = tree.at(0, 0);
auto bavariaSize = tree.at({0, 0}, 1);

访问树状结构中的行和项的基本模式与访问表格中的行和项相同。不过,适配器会确保在修改整行时保持树状结构。

// deletes the old row - tree was moved in
tree.at({0, 0}) = new TreeRow{"Berlin", 892};

在本例中,创建了一个新的行对象,并将其分配给第一个顶层项的第一个子项。

迭代器 API

使用 begin() 和 end() 获取模型行的迭代器,或使用 ranged-for。如果范围是一个项目列表,那么取消引用迭代器就可以访问项目数据。

for(const auto &book: std::as_const(books)) {    qDebug() << "The book" << book.title()
            << "written by"<<book.author()<< "has"<<book.rating()<< "stars"; }

at() 的常量和可变重载一样,可变迭代器将取消引用包装器。

for(autobook : books) {    qDebug() << "The book" << book->title()
            << "written by"<<  book->author()<< "has"<<  book->rating()<< "stars"; Book copy=book; copy.setRating(copy.rating()+ 1); book=copy; }

使用重载箭头操作符访问项目类型的 const 成员,并赋值给包装器以替换值。

如果范围是一个表或树,那么遍历模型就可以访问行。

QRangeModelAdaptertable(std::vector<std::pair<intQString>>{ // ~~~});for(const auto &row: std::as_const(table)) {    qDebug() << "Number is" << row->first << "and string is" << row->second;
}

常量迭代器和可变迭代器都将取消引用行的封装类型。这确保我们可以一致地遍历每一列,即使底层行类型不是范围(例如,它可能是一个元组或小工具)。

for(const auto &row: std::as_const(table)) {for(const auto &item: row) {        qDebug() << item; // item is a QVariant
    } }

迭代可变表时,我们可以覆盖整行。

for(autorow : table) {    qDebug() << "Number is" << row->first << "and string is" << row->second;
    row=std::make_pair(42,u"forty-two"_s); }

模型会对所有行中的所有项和所有角色发出dataChanged() 信号。

for (auto row : table) {
    for (auto item : row) {
        item = 42;
    }
}

遍历可变行允许我们修改单个项目。

在对一棵树进行遍历时,行包装器有两个额外的成员函数hasChildren() 和 children(),允许我们使用遍历器遍历整棵树。

for (auto row : tree) {
    if (row.hasChildren()) {
        for (auto child : row.children()) {
            // ~~~
        }
    }
}

children()返回的对象是一个 QRangeModelAdapter,它与被调用者在同一模型上运行,但所有操作都将使用源行索引作为父索引。

另请参见 QRangeModel

成员类型文档

[alias] QRangeModelAdapter::range_type

成员函数文档

[default] QRangeModelAdapter::QRangeModelAdapter(Range &&range, Protocol &&protocol)

[default] QRangeModelAdapter::QRangeModelAdapter(Range &&range)

构造一个QRangeModelAdapter ,对range 进行操作。对于树范围,可选的protocol 将用于树遍历。

有关对Range 的要求,以及range 的值类别如何改变适配器、模型和范围之间的交互,请参阅QRangeModel 构造函数文档。

另请参阅 QRangeModel

template <typename NewRange = QRangeModelAdapter<Range, Protocol, Model>::range_type, QRangeModelAdapter<Range, Protocol, Model>::if_assignable_range<NewRange> = true> void QRangeModelAdapter::assign(NewRange &&newRange)

template < typename NewRange = QRangeModelAdapter<Range, Protocol, Model>::range_type, QRangeModelAdapter<Range, Protocol, Model>::if_assignable_range<NewRange> = true, QRangeModelAdapter<Range, Protocol, Model>::unless_adapter<NewRange> = true > QRangeModelAdapter<Range, Protocol, Model> &QRangeModelAdapter::operator=(NewRange &&newRange)

newRange 中的行替换模型的内容,可能使用移动语义。

该函数使model() 发出modelAboutToBeReset() 和modelReset() 信号。

限制条件

只有当Range 是可变的,且newRange 的类型可以分配给Range ,但不能分配给QRangeModelAdapter 时,才参与重载解析。

另请参见 range()、at()、model() 和assign()。

template <typename Row, QRangeModelAdapter<Range, Protocol, Model>::if_assignable_range<std::initializer_list<Row>> = true> void QRangeModelAdapter::assign(std::initializer_list<Row> newRange)

template <typename Row, QRangeModelAdapter<Range, Protocol, Model>::if_assignable_range<std::initializer_list<Row>> = true> QRangeModelAdapter<Range, Protocol, Model> &QRangeModelAdapter::operator=(std::initializer_list<Row> newRange)

newRange 中的记录替换模型内容。

限制条件

只有当Range 是可变的,且newRange 可以分配给Range 时,才参与重载解析。

另请参阅 range()、atmodel()。

template < typename InputIterator, typename Sentinel, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > void QRangeModelAdapter::assign(InputIterator first, Sentinel last)

用范围 [first,last) 中的行替换模型的内容。

另请参阅 range(),at, 和model().

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::at(QSpan<const int> path)

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::operator[](QSpan<const int> path)

返回一个可变包装器,其中包含对path 指定的树行的引用。

要修改树行,可为其赋值。分配新的树行会将新树行的父级设置为旧树行的父级。但是,新旧树行都不能有任何子行。要访问树行,可使用operator*() 来取消引用包装器,或使用operator->() 来访问树行成员。

注意: 修改范围会使包装器失效。

限制条件

只有当Range 是一棵树时,才会参与重载解析。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_list<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::at(int row)

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_list<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::operator[](int row)

返回row 中的值,并将其封装为存储在Range 中的类型的可变引用。

注意: 修改范围将使引用失效。要修改引用,请为其赋值。除非存储在Range 中的值是指针,否则无法访问存储值的各个成员。

限制条件

只有当Range 是一个可变列表时,才会参与重载解析。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_table<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::at(int row)

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_table<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::operator[](int row)

返回row 的记录的可变引用,该引用存储在Range 中。

限制条件

只有当Range 是可变表而不是树时,才会参与重载解析。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::at(int row)

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::operator[](int row)

返回一个可变包装器,其中包含对row 指定的树行的引用。

要修改树行,可为其赋值。分配新的树行会将新树行的父级设置为旧树行的父级。但是,新旧树行都不能有任何子行。要访问树行,可使用operator*() 来取消引用包装器,或使用operator->() 来访问树行成员。

注意: 修改范围会使包装器失效。

限制条件

只有当Range 是一棵树时,才会参与重载解析。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> decltype(auto) QRangeModelAdapter::at(QSpan<const int> path) const

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> decltype(auto) QRangeModelAdapter::operator[](QSpan<const int> path) const

返回path 指定的行的常量引用,该行存储在Range 中。

限制条件

只有当Range 是一棵树时,才会参与重载解析。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_list<I> = true> auto QRangeModelAdapter::at(int row) const

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_list<I> = true> auto QRangeModelAdapter::operator[](int row) const

row 中的值返回为Range 中存储的类型。

限制条件

只有当Range 是一个列表时,才会参与重载解析。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I> = true> decltype(auto) QRangeModelAdapter::at(int row) const

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I> = true> decltype(auto) QRangeModelAdapter::operator[](int row) const

返回row 行的常量引用,该行存储在Range 中。

限制条件

只有当Range 是表或树时,才会参与重载解析。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::at(QSpan<const int> path, int column)

返回存储为pathcolumn 所指定项目的值的可变引用。如果项目是多角色项目,那么这将是对整个项目的引用。如果Range 中的行在不同列存储不同类型,则返回类型将是QVariant

注意: 对范围的修改将使该引用失效。要修改引用,请为其赋值。除非Range 中存储的值是指针,否则无法访问存储值的各个成员。

限制条件

只有当Range 是可变树时,才会参与重载解析。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > auto QRangeModelAdapter::at(int row, int column)

返回存储为rowcolumn 所指定项目的值的可变引用。如果项目是多角色项目,则这将是对整个项目的引用。

注意: 对范围的修改将使该引用失效。要修改引用,请为其分配一个新值。除非Range 中存储的值是指针,否则无法访问存储值的各个成员。

限制条件

只有当Range 是一个可变表时,才会参与重载解析。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> auto QRangeModelAdapter::at(QSpan<const int> path, int column) const

返回存储为pathcolumn 所指定项目的值的副本。如果项目是多角色项目,则返回整个项目的副本。如果Range 中的行在不同列存储不同类型,则返回类型将是QVariant

限制条件

只有当Range 是一棵树时,才会参与重载解析。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I> = true> auto QRangeModelAdapter::at(int row, int column) const

返回存储为rowcolumn 所指定项目的值的副本。如果项目是多角色项目,则返回整个项目的副本。如果Range 中的行在不同列存储不同类型,则返回类型将是QVariant

限制条件

只有当Range 是表或树时,才会参与重载解析。

int QRangeModelAdapter::columnCount() const

返回列数。如果Range 表示一个列表,则返回 1,否则返回每行的元素数。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_list<I> = true> QVariant QRangeModelAdapter::data(int row) const

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_list<I> = true> QVariant QRangeModelAdapter::data(int row, int role) const

返回QVariant ,其中包含存储在给定role 下的项目row 的数据,如果没有项目,则返回无效的QVariant 。如果未指定role ,则返回一个包含完整项目的QVariant

限制条件

只有当Range 是一个列表时,才会参与重载解析。

另请参见 setData() 和at()。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> QVariant QRangeModelAdapter::data(QSpan<const int> path, int column) const

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> QVariant QRangeModelAdapter::data(QSpan<const int> path, int column, int role) const

返回QVariant ,其中包含在给定的role 下为pathcolumn 提及的项目存储的数据,如果没有为该位置或角色存储数据,则返回无效的QVariant 。如果未指定role ,则返回一个包含完整项目的QVariant

限制条件

只有当Range 是一棵树时,才会参与重载解析。

另请参阅 setData() 和at()。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I> = true> QVariant QRangeModelAdapter::data(int row, int column) const

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I> = true> QVariant QRangeModelAdapter::data(int row, int column, int role) const

返回QVariant ,其中包含rowcolumn 提及的项目在给定的role 下存储的数据,如果该位置或角色没有存储数据,则返回无效的QVariant 。如果未指定role ,则返回一个包含完整项目的QVariant

限制条件

只有当Range 是表或树时,才会参与重载解析。

另请参阅 setData() 和at()。

[constexpr] template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> bool QRangeModelAdapter::hasChildren(int row) const

[constexpr] template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> bool QRangeModelAdapter::hasChildren(QSpan<const int> row) const

返回row 下是否有记录。

限制条件

只有当Range 是一棵树时,才会参与重载解析。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_list<I> = true> QModelIndex QRangeModelAdapter::index(int row) const

返回rowQModelIndex

限制条件

只有当Range 是一维列表时,才参与重载解析。

这是一个重载函数。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> QModelIndex QRangeModelAdapter::index(QSpan<const int> path, int column) const

返回column 中的项目在path 所指定的树中的行的QModelIndex

限制条件

只有当Range 是一棵树时,才参与重载解析。

这是一个重载函数。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I> = true> QModelIndex QRangeModelAdapter::index(int row, int column) const

Returns theQModelIndex for the item atrow,column

限制条件

只有当Range 是表或树时,才参与重载解析。

这是一个重载函数。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertColumns<I> = true> bool QRangeModelAdapter::insertColumn(int before)

在所有行中before 指定的列之前插入一个空列,并返回插入是否成功。如果before 的值与columnCount() 的值相同,那么该列将被附加到每一行中。

限制条件

只有当Range 具有支持插入元素的行时,才会参与重载解析。

这是一个重载函数。

另请参阅 removeColumn()、insertColumns() 和insertRow()。

template < typename D, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertColumns<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_column_data<D> = true > bool QRangeModelAdapter::insertColumn(int before, D &&data)

before 指定的列之前向所有行插入由data 构建的单列,并返回插入是否成功。如果before 的值与columnCount() 相同,那么该列将被追加到每一行。

如果data 是单个值,那么所有行中的新条目都将由该单个值构建。

如果data 是一个容器,那么该容器中的元素将按顺序用于构建随后每一行的列。如果data 中的元素数少于行数,那么函数会绕一圈,从第一个元素重新开始。

限制条件

只有当Range 有支持插入元素的行,且元素可从data 中的条目构建时,才参与重载解析。

这是一个重载函数。

另请参见 removeColumn()、insertColumns() 和insertRow()。

template < typename C, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertColumns<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_column_range<C> = true > bool QRangeModelAdapter::insertColumns(int before, C &&data)

data 中的元素在before 指定的列之前构建的列插入所有行,并返回插入是否成功。如果before 的值与columnCount() 相同,那么该列将被追加到每一行。

如果data 中的元素是值,那么所有行中的新条目都将由这些值构建。

如果data 中的元素是容器,那么将依次使用外层容器中的条目来构建随后每一行的新条目。如果data 中的元素数量少于行的数量,那么函数会绕一圈,从第一个元素重新开始。

限制条件

只有当Range 有支持插入元素的行,且元素可以从data 中的条目构建时,才会参与重载解析。

另请参见 removeColumns()、insertColumn() 和insertRows()。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertRows<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true > bool QRangeModelAdapter::insertRow(QSpan<const int> before)

before 指定路径的记录前插入一条空记录,并返回插入是否成功。如果beforerowCount() 的值相同,则将添加新行。

限制条件

只有当Range 是一个支持插入元素的树时,才参与重载解析。

这是一个重载函数。

另请参阅 insertRows()、removeRow() 和insertColumn()。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertRows<I> = true> bool QRangeModelAdapter::insertRow(int before)

before 的记录前插入一条空记录,并返回插入是否成功。如果before 的值与rowCount() 的值相同,则将添加新记录。

限制条件

只有当Range 支持插入元素时,才参与重载解析。

这是一个重载函数。

另请参阅 insertRows()、removeRow() 和insertColumn()。

template < typename D, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertRows<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_row<D> = true, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true > bool QRangeModelAdapter::insertRow(QSpan<const int> before, D &&data)

before 的记录之前插入由data 构建的单行,并返回插入是否成功。如果before 的值与rowCount() 的值相同,则将追加新记录。

限制条件

只有当Range 是支持插入元素的树,并且可以从data 构建行时,才参与重载解析。

这是一个重载函数。

另请参见 insertRows()、removeRow() 和insertColumn()。

template < typename D, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertRows<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_row<D> = true > bool QRangeModelAdapter::insertRow(int before, D &&data)

before 的记录之前插入由data 构建的单行,并返回插入是否成功。如果before 的值与rowCount() 的值相同,则将追加新记录。

限制条件

只有当Range 支持插入元素,并且可以从data 构建行时,才参与重载解析。

这是一个重载函数。

另请参见 insertRows()、removeRow() 和insertColumn()。

template < typename C, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertRows<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_row_range<C> = true, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true > bool QRangeModelAdapter::insertRows(QSpan<const int> before, C &&data)

before 的记录之前插入由data 中的元素构建的记录,并返回插入是否成功。如果before 的值与rowCount() 的值相同,则将追加新记录。

限制条件

只有当Range 是一个支持插入元素的树,并且可以从data 中的元素构造行时,才参与重载解析。

这是一个重载函数。

另请参阅 insertRow()、removeRows() 和insertColumns()。

template < typename C, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertRows<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_row_range<C> = true > bool QRangeModelAdapter::insertRows(int before, C &&data)

before 的记录之前插入由data 中的元素构建的记录,并返回插入是否成功。如果before 的值与rowCount() 的值相同,则将追加新记录。

限制条件

只有当Range 支持插入元素,并且可以从data 中的元素构造行时,才参与重载解析。

这是一个重载函数。

另请参阅 insertRow()、removeRows() 和insertColumns()。

Model *QRangeModelAdapter::model() const

返回此适配器创建的QRangeModel 实例。

另请参阅 range() 和at()。

template <typename F, QRangeModelAdapter<Range, Protocol, Model>::if_canMoveItems<F> = true> bool QRangeModelAdapter::moveColumn(int from, int to)

from 处的列移动到to 处的列,并返回列是否成功移动。

限制条件

只有当Range 的行支持元素移动时,才会参与重载解析。

另请参阅 insertColumn()、removeColumn()、moveColumns() 和moveRow()。

template <typename F, QRangeModelAdapter<Range, Protocol, Model>::if_canMoveItems<F> = true> bool QRangeModelAdapter::moveColumns(int from, int count, int to)

count 中从from 开始的列移动到to 的位置,并返回列是否成功移动。

限制条件

只有当Range 的行支持元素移动时,才会参与重载解析。

另请参阅 insertColumns()、removeColumns()、moveColumn() 和moveRows()。

template < typename I, typename F, QRangeModelAdapter<Range, Protocol, Model>::if_canMoveItems<F> = true, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true > bool QRangeModelAdapter::moveRow(QSpan<const int> source, QSpan<const int> destination)

source 处的树枝移动到destination 处的位置,并返回是否成功移动树枝的结果。

限制条件

只有当Range 是支持元素移动的树时,才参与重载解析。

这是一个重载函数。

另请参阅 insertRow()、removeRow() 和moveColumn()。

template <typename F, QRangeModelAdapter<Range, Protocol, Model>::if_canMoveItems<F> = true> bool QRangeModelAdapter::moveRow(int source, int destination)

source 处的记录移动到destination 处的位置,并返回是否成功移动记录。

限制条件

只有当Range 支持元素移动时,才参与重载解析。

这是一个重载函数。

另请参阅 insertRow()、removeRow() 和moveColumn()。

template < typename I, typename F, QRangeModelAdapter<Range, Protocol, Model>::if_canMoveItems<F> = true, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true > bool QRangeModelAdapter::moveRows(QSpan<const int> source, int count, QSpan<const int> destination)

count 树枝从source 开始移动到destination 的位置,并返回是否成功移动了行。

限制条件

只有当Range 是支持元素移动的树时,才参与重载解析。

这是一个重载函数。

另请参阅 insertRows()、removeRows() 和moveColumns()。

template <typename F, QRangeModelAdapter<Range, Protocol, Model>::if_canMoveItems<F> = true> bool QRangeModelAdapter::moveRows(int source, int count, int destination)

countsource 开始的记录移动到destination 的位置,并返回是否成功移动了记录。

限制条件

只有当Range 支持移动元素时,才参与重载解析。

这是一个重载函数。

另请参阅 insertRows()、removeRows() 和moveColumns()。

const QRangeModelAdapter<Range, Protocol, Model>::range_type &QRangeModelAdapter::range() const

返回模型适配器操作范围的常量引用。

另请参阅 assign()、at() 和model()。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canRemoveColumns<I> = true> bool QRangeModelAdapter::removeColumn(int column)

从每一行中移除给定的column ,并返回是否成功移除。

限制条件

只有当Range 有支持移除元素的行时,才会参与重载解析。

另请参阅 insertColumn()、removeColumns() 和removeRow()。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canRemoveColumns<I> = true> bool QRangeModelAdapter::removeColumns(int column, int count)

从每一行中删除以给定的column 开始的count 列,并返回删除是否成功。

限制条件

只有当Range 有支持移除元素的行时,才会参与重载解析。

另请参阅 insertColumns()、removeColumn() 和removeRow()。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canRemoveRows<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true > bool QRangeModelAdapter::removeRow(QSpan<const int> path)

删除path 处的记录,包括该行的所有子行,并返回删除是否成功。

限制条件

只有当Range 是一棵支持元素移除的树时,才参与重载解析。

这是一个重载函数。

另请参阅 removeRows()、removeColumn() 和insertRow()。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canRemoveRows<I> = true> bool QRangeModelAdapter::removeRow(int row)

删除给定的row ,并返回删除是否成功。

限制条件

只有当Range 支持移除元素时,才参与重载解析。

这是一个重载函数。

另请参阅 removeRows()、removeColumn() 和insertRow()。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canRemoveRows<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true > bool QRangeModelAdapter::removeRows(QSpan<const int> path, int count)

path 指定的行开始删除count 行,并返回删除是否成功。

限制条件

只有当Range 是一棵支持移除元素的树时,才参与重载解析。

这是一个重载函数。

另请参阅 removeRow()、removeColumns() 和insertRows()。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canRemoveRows<I> = true> bool QRangeModelAdapter::removeRows(int row, int count)

删除countrow 开始的记录,并返回删除是否成功。

限制条件

只有当Range 支持移除元素时,才参与重载解析。

这是一个重载函数。

另请参阅 removeRow()、removeColumns() 和insertRows()。

int QRangeModelAdapter::rowCount() const

返回行数。如果Range 代表一个列表或表格,那么这就是行数。对于树,这是顶层行数。

这是一个重载函数。

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> int QRangeModelAdapter::rowCount(int row) const

template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true> int QRangeModelAdapter::rowCount(QSpan<const int> row) const

返回row 下的行数。

限制条件

只有当Range 是一棵树时,才会参与重载解析。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_list<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > bool QRangeModelAdapter::setData(int row, const QVariant &value, int role = Qt::EditRole)

row 项目的role 数据设置为value

如果成功,则返回true ;否则返回false

限制条件

只有当Range 是一个可变列表时,才会参与重载解析。

另请参阅 data() 和at()。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > bool QRangeModelAdapter::setData(QSpan<const int> path, int column, const QVariant &value, int role = Qt::EditRole)

pathcolumn 所引用项目的role 数据设置为value

如果成功,则返回true ;否则返回false

限制条件

只有当Range 是可变树时,才会参与重载解析。

另请参阅 data() 和at()。

template < typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I> = true, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I> = true > bool QRangeModelAdapter::setData(int row, int column, const QVariant &value, int role = Qt::EditRole)

rowcolumn 所引用项目的role 数据设置为value

如果成功,则返回true ;否则返回false

限制条件

只有当Range 是可变的,而不是列表时,才会参与重载解析。

另请参阅 data() 和at()。

相关非成员

[noexcept] bool operator!=(const QRangeModelAdapter<Range, Protocol, Model> &lhs, const QRangeModelAdapter<Range, Protocol, Model> &rhs)

返回lhs 是否不等于rhs 。如果两个适配器都持有相同的model 实例,则这两个适配器是相等的。

[noexcept] bool operator==(const QRangeModelAdapter<Range, Protocol, Model> &lhs, const QRangeModelAdapter<Range, Protocol, Model> &rhs)

返回lhs 是否等于rhs 。如果两个适配器都持有相同的model 实例,则这两个适配器是相等的。

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