[Предыдущая: Программирование модель/представление] [Следующая: Использование моделей и представлений] Введение в программирование модель/представление
В Qt 4 введен новый набор классов для просмотра элементов использующих архитектуру модель/представление для управления взаимосвязью между данными и методом их представления пользователю. Разделение функциональности, введенное в этой архитектуре, дает разработчикам большую гибкость в настройке отображения элементов и предоставляет стандартный интерфейс модели, позволяющий широкому диапазону источников данных использовать существующие представления элементов. В этом документе мы дадим краткое описание парадигмы модель/представление, выделим концепции и опишем архитектуру системы представления элементов. Каждый компонент данной архитектуры будет описан и будут предоставлены примеры, показывающие как использовать предоставленные классы. Архитектура модель/представлениеАрхитектура модель-представление-контроллер (Model-View-Controller, MVC) является шаблоном проектирования, берущим начало от Smalltalk, который часто используется для создания пользовательских интерфейсов. В книге Design Patterns Гаммы (Gamma) и других написано:
Если объединить объекты представления и контроллера, то в результате получится архитектура модель/представление. Это все еще отделяет способ хранения данных от способа их представления пользователю, но обеспечивает простую структуру, основанную на тех же принципах. Данное разделение дает возможность показать пользователю одни и те же данных в различных представлениях и реализовать новые типы представлений без изменения базовой структуры данных. Чтобы обеспечить гибкость управления пользовательским вводом, мы представляем концепцию делегата (delegate). Преимущество наличия делегата в этой структуре состоит в том, что это дает возможность для настройки представления и редактирования элементов данных.
Как правило, классы модель/представление могут быть разделены на три описанные выше группы: модели, представления и делегаты. Каждый из этих компонентов описывается абстрактным классом, предоставляющим общий интерфейс и, в некоторых случаях, особенности реализации по умолчанию. Абстрактные классы подразумевают наследование от них в порядке, предоставляющем полный набор функциональности, ожидаемой другими компонентами; это позволяет также писать специализированные компоненты. Модели, представления и делегаты взаимодействуют друг с другом используя сигналы и слоты:
МоделиВсе модели элементов основаны на классе QAbstractItemModel. Этот класс определяет интерфейс, используемый представлениями и делегатами для доступа к данным. Сами данные не должны храниться в модели; они могут храниться в структуре данных или хранилище, предоставляемом отдельным классом, файле, базе данных или каком-либо другом прикладном компоненте. Базовые концепции моделей описаны в разделе Классы моделей. QAbstractItemModel обеспечивает достаточно гибкий интерфейс к данным для обработки представлений, которые представляют данные в виде таблиц, списков и деревьев. Однако, при реализации новых моделей в виде структур списков и таблиц, классы QAbstractListModel и QAbstractTableModel послужат лучшей отправной точкой, так как они предоставляют реализации соответствующих функций по умолчанию. На основе каждого из этих классов можно создать подклассы для предоставления моделей, поддерживающих специфичные виды списков и таблиц. Процесс создания подклассов моделей обсуждается в разделе Создание новых моделей. Qt предоставляет несколько готовых моделей, которые могут использоваться для обработки элементов данных:
Если эти стандартные модели не отвечают вашим требованиям, то для создания своих собственных моделей вы можете создать подкласс 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. Каждый из разделов предоставляет пример использования и сопровождается подразделом, показывающим, как вы можете создавать новые компоненты. [Предыдущая: Программирование модель/представление] [Следующая: Использование моделей и представлений]
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |