Шаг 104.
Библиотека Qt.
Класс QModelIndex

    На этом шаге рассмотрим класс QModelIndex.

    Итак, мы определили структуру данных, представляющую собой таблицу. Теперь нам нужен способ для получения доступа к каждому ее элементу. Например, для двумерной таблицы без иерархии это означает, что мы могли бы использовать строку и столбец, чего было бы достаточно. Но при использовании иерархии нам понадобится другое решение. В этом случае нужно знать дополнительную информацию относительно строки и столбца. Эта информация и будет индексом модели.

    Индекс модели — это небольшой список объектов, который используется для адресации ячейки в таблице, имеющей иерархию. Индекс модели представляет собой информацию, состоящую из трех частей: строки, столбца и внутреннего идентификатора. Внутренний идентификатор зависит от реализации; это может быть указатель или, например, целочисленный индекс.

    Каждая ячейка таблицы имеет уникальный индекс, который представлен классом QModelIndex. Индексы класса QModelIndex запоминать в программе не имеет смысла, т. к. они могут измениться, например, после сортировки. Однако ими удобно пользоваться для получения текущих значений ячеек таблицы с помощью метода QAbstractItemModel::data(). Получить индекс модели для любой ячейки можно методом QAbstractItemModel::index(), при помощи которого можно двигаться по всей структуре данных. Например, для того чтобы узнать значение ячейки с координатами (2, 5), нужно проделать следующее:

QModelIndex index = pModel->index(2, 5, QModelIndex());
QVariant value = pModel->data(index);

    Может получиться так, что подтаблица не располагает элементом с заданными нами координатами (2, 5). В этом случае метод index() возвратит пустой индекс (invalid index). Является ли индекс действительно неверным или пустым, можно проверить вызовом метода QModelIndex::isValid().

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

    На следующем шаге рассмотрим организацию иерархических данных.




Предыдущий шаг Содержание Следующий шаг