На этом шаге рассмотрим понятие "модели", как составной части технологии "интервью".
Модель — это оболочка вокруг исходных данных, предоставляющая стандартный интерфейс для доступа к ним. Так как именно интерфейс модели является основной единицей,обеспечивающей связь между моделью и представлением, это дает дополнительные преимущества, а именно модели можно разрабатывать отдельно друг от друга и при необходимости заменять одну на другую. Интерфейс любой Qt-модели базируется на классе QAbstractItemModel (рис. 1). Для того чтобы создать свою собственную модель, вам придется унаследовать либо этот класс, либо один из его потомков.
Рис.1. Иерархия классов модели
Сам класс QAbstractItemModel представляет собой обобщенную таблицу, за каждой ячейкой которой можно закрепить подтаблицу. Благодаря этому свойству можно создавать модели для сложных структур данных. Например, для древовидной структуры, описывающей содержимое каталога, некоторая ячейка, находящаяся в строке и представляющая каталог, будет иметь подтаблицу, строки которой будут соответствовать файлам и подкаталогам. Подкаталоги, в свою очередь, могут также иметь подтаблицы со строками, в которых будут появляться файлы и подкаталоги и т. д.
Рассмотрим некоторые унаследованные от QAbstractItemModel классы, показанные на рис. 1. Класс QAbstractListModel представляет собой одномерный список, а класс QAbstractTableModel — двумерную таблицу.
Класс QStandardItemModel позволяет напрямую сохранять данные в модели. Хоть это и немного противоречит основной идее "модель-представление", но в некоторых приложениях, которые манипулируют незначительным количеством данных, является довольно удобным и практичным подходом.
Класс QStringListModel — это реализация QAbstractListModel, которая предоставляет одномерную модель, предназначенную для работы со списком строк. Источник данных — это список строк (QStringList). Эта модель предоставляет возможность редактирования, т. е. если пользователь с помощью представления изменит одну из записей, то старая запись будет замещена новой. Каждая запись соответствует одной строке. Например:
QStringListModel model; model.setStringList(QStringList() << "Первая строка" << "Вторая строка" << "Третья строка" );
Основная идея класса QAbstractProxyModel состоит в извлечении данных из модели, проведении некоторых манипуляций с ними и возвращении их в качестве новой модели. Таким образом можно осуществлять выборку и сортировку данных. Для проведения этих операций можно воспользоваться унаследованным классом QSortFilterProxyModel.
Класс QDirModel представляет собой готовый класс иерархии файловой системы.
Данные, предоставляемые моделями, могут совместно использоваться, посредством интерфейса, различными представлениями (виджетами, унаследованными от QAbstarctItemView) (рис. 2). Для того чтобы модель и представление могли понимать друг друга, модель информирована об основных свойствах представления: каждая запись занимает в ней одну строку и столбец, а также может иметь индекс, который играет важную роль во вложенных структурах.
Рис.2. Связь модели с различными представлениями
На следующем шаге рассмотрим понятие "представления", как составной части технологии "модель-представление".