Класс QModelRoleDataSpan
Класс QModelRoleDataSpan предоставляет разрез над объектами QModelRoleData. Подробнее...
| Заголовок: | #include <QModelRoleDataSpan> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| С момента: | Qt 6.0 |
Открытые функции
| QModelRoleDataSpan(Container &c) | |
| QModelRoleDataSpan(QModelRoleData *modelRoleData, qsizetype len) | |
| QModelRoleDataSpan(QModelRoleData &modelRoleData) | |
| QModelRoleDataSpan() | |
| 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().
Документация по членам-функциям
шаблон <typename Container, если_совместимый_контейнер<Container>> QModelRoleDataSpan::QModelRoleDataSpan(Container &c)
Создаёт QModelRoleDataSpan, охватывающий контейнер c, который может быть любым непрерывным контейнером объектов QModelRoleData. Например, это может быть QVector<QModelRoleData>, std::array<QModelRoleData, 10> и так далее.
Примечание: Контейнер должен оставаться активным до тех пор, пока этот объект не будет уничтожен.
QModelRoleDataSpan::QModelRoleDataSpan(QModelRoleData *modelRoleData, qsizetype len)
Создаёт QModelRoleDataSpan, охватывающий массив, начинающийся с modelRoleData и имеющий длину len.
Примечание: Массив должен оставаться активным до тех пор, пока этот объект не будет уничтожен.
QModelRoleDataSpan::QModelRoleDataSpan(QModelRoleData &modelRoleData)
Создаёт QModelRoleDataSpan, охватывающий modelRoleData, рассматриваемый как массив из одного элемента.
QModelRoleDataSpan::QModelRoleDataSpan()
Создаёт пустой QModelRoleDataSpan. Его data() будет установлен на nullptr, а его длина — на ноль.
QModelRoleData *QModelRoleDataSpan::begin() const
Возвращает указатель на начало разреза, представленного этим объектом.
QModelRoleData *QModelRoleDataSpan::data() const
Возвращает указатель на начало разреза, представленного этим объектом.
QVariant *QModelRoleDataSpan::dataForRole(int role) const
Возвращает данные, связанные с первым QModelRoleData в разрезе, у которого роль равна role. Если такой объект QModelRoleData не существует, поведение не определено.
Примечание: Избегайте вызова этой функции со стороны модели, так как модель не может заранее знать, какие роли находятся в заданном QModelRoleDataSpan. Вместо этого эта функция подходит для представлений и делегатов, которые контролируют роли в разрезе.
См. также QModelRoleData::data().
QModelRoleData *QModelRoleDataSpan::end() const
Возвращает указатель на воображаемый элемент, следующий за концом разреза, представленного этим объектом.
qsizetype QModelRoleDataSpan::length() const
Возвращает длину разреза, представленного этим объектом.
qsizetype QModelRoleDataSpan::size() const
Возвращает длину разреза, представленного этим объектом.
QModelRoleData &QModelRoleDataSpan::operator[](qsizetype index) const
Возвращает изменяемую ссылку на QModelRoleData по позиции index в разрезе.
Примечание: index должен быть допустимым индексом для этого разреза (0 <= index < size()).
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qmodelroledataspan.html