Индексы модели

Последнее обновление: 12.01.2024

Для обращения к данных, их извлечения или редактирования применяются индексы модели (model index). Представления и делегаты используют эти индексы для запроса элементов данных для отображения. Индексы моделей бывают двух типов:

  • Временные индексы модели. Представляют класс QModelIndex и хранят временные ссылки на фрагменты информации. Время от времени модели могут реорганизовывать свою внутреннюю структуру, поэтому временные индексы моделей могут стать недействительными, соответственно их не следует сохранять.

  • Постоянные индексы модели. Представляют класс QPersistentModelIndex и хранят постоянные ссылки на данные модели

В простейшей форме данные модели можно ассоциировать с простой таблицей, в которой элементы расположены по номерам строк и столбцов. Однако это не значит, что все элементы данных хранятся в виде массива или таблицы, а использование номеров строк и столбцов является всего лишь условностью. Для получения индекса модели на определенный элемент данных применяется у объекта модели (объекта QAbstractItemModel) применяется метод index:

QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex())

В этот метод передается три параметра: номер строки элемента, номер столбца элемента и индекс модели родительского элемента (если мы имеем дело с данными в виде дерева). В результате возвращается объект QModelIndex, который и представляет индекс модели для текущего элемента.

Если не указан индекс модели родительского элемента, то по умолчанию для третьего параметра вызывается метод QModelIndex::QModelIndex(), который создает пустой индекс.

Например, пусть данные модели условно представлены следующей таблицей:

Индексы модели в Qt

В этом случае для получения индексов на элементы A, B и C следует использовать следующие выражения:

QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexB = model->index(1, 1, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());

В случае с таблицей родительский элемент отсутствует, поэтому для третьего параметра передается результат вызова QModelIndex()

Например, в случае с моделью типа QStringListModel данные представляют простейший список строк, поэтому столбец всегда будет равен 0 (только один столбец и множество строк)

#include <QApplication>
#include <QStringListModel>
#include <iostream>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // определяем данные для модели
    QStringList list = {"Tom", "Bob", "Sam"};
    // определяем модель
    QStringListModel *model = new QStringListModel(list);
    // получаем индекс
    QModelIndex bobIndex = model->index(1, 0);
    // получаем элемент по индексу
    QString bobText = bobIndex.data().toString();
    // альтернативный способ 
    // QString bobText =  model->data(bobIndex, Qt::DisplayRole).toString();
    std::cout << bobText.toStdString() << std::endl;    // Bob
    return a.exec();
}

В данном случае данные модели представлены списком из трех строк. Для получения индекса второго элемента применяется выражение

model->index(1, 0);

Для получения данных по индексу у объекта QModelIndex применяется метод data()

QString bobText = bobIndex.data().toString();

Поскольку данные модели представляют строки, то в данном случае мы можем преобразовать полученные данные в тип QString. Затем выводим данные для проверки на консоль.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850