Для обращения к данных, их извлечения или редактирования применяются индексы модели (model index). Представления и делегаты используют эти индексы для запроса элементов данных для отображения. Индексы моделей бывают двух типов:
Временные индексы модели. Представляют класс QModelIndex и хранят временные ссылки на фрагменты информации. Время от времени модели могут реорганизовывать свою внутреннюю структуру, поэтому временные индексы моделей могут стать недействительными, соответственно их не следует сохранять.
Постоянные индексы модели. Представляют класс QPersistentModelIndex и хранят постоянные ссылки на данные модели
В простейшей форме данные модели можно ассоциировать с простой таблицей, в которой элементы расположены по номерам строк и столбцов. Однако это не значит, что
все элементы данных хранятся в виде массива или таблицы, а использование номеров строк и столбцов является всего лишь условностью.
Для получения индекса модели на определенный элемент данных применяется у объекта модели (объекта QAbstractItemModel
) применяется метод index:
QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex())
В этот метод передается три параметра: номер строки элемента, номер столбца элемента и индекс модели родительского элемента (если мы имеем дело с данными в виде дерева). В результате возвращается объект QModelIndex, который и представляет индекс модели для текущего элемента.
Если не указан индекс модели родительского элемента, то по умолчанию для третьего параметра вызывается метод QModelIndex::QModelIndex()
, который создает пустой индекс.
Например, пусть данные модели условно представлены следующей таблицей:
В этом случае для получения индексов на элементы 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. Затем выводим данные для проверки на консоль.