Qt:Документация 4.3.2/model-view-introduction
Материал из Wiki.crossplatform.ru
Внимание: Актуальная версия перевода документации находится здесь |
__NOTOC__
Главная · Все классы · Основные классы · Классы по группам · Модули · Функции |
[Предыдущая: Программирование модель/представление ] [Следующая: Использование моделей и представлений ]
Содержание |
[править] Введение в программирование модель/представление
В Qt 4 введен новый набор классов для просмотра элементов использующих архитектуру модель/представление для управления взаимосвязью между данными и методом их представления пользователю. Разделение функциональности, введенное в этой архитектуре, дает разработчикам большую гибкость в настройке отображения элементов и предоставляет стандартный интерфейс модели, позволяющий широкому диапазону источников данных использовать существующие представления элементов. В этом документе мы дадим краткое описание парадигмы модель/представление, выделим концепции и опишем архитектуру системы представления элементов. Каждый компонент данной архитектуры будет описан и будут предоставлены примеры, показывающие как использовать предоставленные классы.
[править] Архитектура модель/представление
Архитектура Модель-Представление-Контроллер (Model-View-Controller, MVC) является шаблоном проектирования, берущим начало от Smalltalk, который часто используется для создания пользовательских интерфейсов. В Design Patterns, Gamma и других написано:
MVC состоит из трех типов объектов. Модель - объект приложения, представление - его экранное представление и контроллер - определяет реакцию пользовательского интерфейса на пользовательский ввод. До MVC при разработке пользовательского интерфейса эти объекты смешивались вместе. MVC разделяет их, для увеличения гибкости и возможности повторного использования.
Если объединить объекты представления и контроллера, то в результате получится архитектура модель/представление. Это все еще отделяет способ хранения данных от способа их представления пользователю, но обеспечивает простую структуру, основанную на тех же принципах. Данное разделение дает возможность показать пользователю одни и те же данных в различных видах без изменения структуры данных. Чтобы обеспечить гибкость управления пользовательским вводом, мы представляем концепцию делегата (delegate). Преимущество наличия делегата в этой структуре состоит в том, что это дает возможность для настройки представления и редактирования элементов данных.
Как правило, классы модель/представление могут быть разделены на три описанные выше группы: модели, представления и делегаты. Каждый из этих компонентов описывается абстрактным классом, предоставляющим общий интерфейс и, в некоторых случаях, особенности реализации по умолчанию. Абстрактные классы подразумевают наследование от них в порядке, предоставляющем полный набор функциональности, ожидаемой другими компонентами; это позволяет также писать специализированные компоненты.
Модели, представления и делегаты взаимодействуют друг с другом используя сигналы и слоты:
- Сигналы от модели информируют представление об изменениях данных в источнике данных.
- Сигналы от представления предоставляют информацию о пользовательском взаимодействии с отображаемыми элементами.
- Сигналы от делегата используются во время редактирования, сообщают модели и представлению о состоянии редактора.
[править] Модели
Все модели элементов основаны на классе QAbstractItemModel. Этот класс определяет интерфейс, используемый представлениями и делегатами для доступа к данным. Сами данные не должны храниться в модели; они могут храниться в структуре данных или хранилище, предоставляемом отдельным классом, файле, базе данных или каком-либо другом прикладном компоненте.
Базовые концепции моделей описаны в разделе Классы моделей.
QAbstractItemModel обеспечивает достаточно гибкий интерфейс к данным для обработки представлений, которые представляют данные в виде таблиц, списков и деревьев. Однако, при реализации новых моделей в виде структур списков и таблиц, классы QAbstractListModel и QAbstractTableModel послужат лучшей отправной точкой, так как они предоставляют реализации соответствующих функций по умолчанию. На основе каждого из этих классов можно создать подклассы для предоставления моделей, поддерживающих специфичные виды списков и таблиц.
Процесс создания подклассов моделей обсуждается в разделе Создание новых моделей.
Qt предоставляет несколько готовых моделей, которые могут использоваться для обработки элементов данных:
- QStringListModel используется для хранения простого списка элементов QString.
- QStandardItemModel управляет более сложными древовидными структурами элементов, каждый из которых может содержать произвольные данные.
- QDirModel предоставляет информацию о файлах и директориях локальной файловой системы.
- QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel используются для доступа к базам данных, учитывающим соглашения архитектуры модель/представление.
Если эти стандартные модели не отвечают вашим требованиям, то для создания своих собственных моделей вы можете создать подкласс QAbstractItemModel, QAbstractListModel или QAbstractTableModel.
[править] Представления
Предоставляются полные реализации для различных видов представлений: QListView отображает список элементов, QTableView отображает данные модели в виде таблицы, а QTreeView отображает элементы модели в виде иерархического списка. Каждый из этих классов основан на базовом абстрактном классе QAbstractItemView. Хотя эти классы и готовы к использованию, они могут иметь подклассы, для более точной настройки представления.
Доступные представления описаны в разделе Классы представлений.
[править] Делегаты
QAbstractItemDelegate - это абстрактный базовый класс делегата в структуре модель/представление. Реализация делегата по умолчанию предоставляется классом QItemDelegate, который используется в качестве делегата по умолчанию в стандартных представлениях Qt.
Делегаты описаны в разделе Классы делегатов.
[править] Сортировка
В архитектуре модель/представление имеется два подхода к сортировке; какой подход выбрать - зависит от вашей базовой модели.
Если ваша модель сортируемая, т.е. если она заново реализует функцию QAbstractItemModel::sort(), то и QTableView и QTreeView предоставляют API, позволяющее программно сортировать данные вашей модели. Кроме того, вы можете разрешить интерактивную сортировку (interactive sorting) (т.е. позволить пользователям сортировать данные нажимая на заголовки представления), соединив сигнал QHeaderView::sectionClicked() со слотом QTableView::sortByColumn() или же со слотом QTreeView::sortByColumn(), соответственно.
Альтернативный подход, если ваша модель не имеет необходимого интерфейса или вы хотите использовать представление списка для отображения ваших данных, заключается в использовании модели-посредника для преобразования структуры вашей модели перед передачей данных в представление. Детально это рассматривается в разделе Модели-посредники.
[править] Вспомогательные классы
Множество вспомогательных классов унаследованы от классов стандартных представлений для удобства использования в приложениях, зависящих от основанных на элементах представлениях Qt и классах таблиц. Они не предназначены для создания на их основе подклассов, а существуют просто как эквивалент классов Qt3, работающих по старой схеме. Примерами таких классов служат QListWidget, QTreeWidget и QTableWidget, реализующие поведение, подобное поведению классов Qt 3 QListBox, QListView и QTable.
Эти классы менее гибки, чем классы представлений и не могут использоваться с произвольными моделями. Если вы не сильно нуждаетесь в наборе основанных на элементах классов, мы рекомендуем использовать при обработке данных в представлениях элементов подход на основе модель/представление.
Если же вы хотите воспользоваться достоинствами разделения данных и представления не отказываясь от схемы явного предварительного заполнения данных, как например QListView, QTableView и QTreeView с моделью QStandardItemModel.
[править] Компоненты модель/представление
Следующие разделы описывают способ использования архитектуры модель/представление Qt. Каждый из разделов предоставляет пример использования и сопровождается подразделом, показывающим, как вы можете создавать новые компоненты.
[Предыдущая: Программирование модель/представление ] [Следующая: Использование моделей и представлений ]
Copyright © 2007 Trolltech | Trademarks | Qt 4.3.2
|