Qt:Документация 4.3.2/model-view-introduction

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

Image:trolltech-logo.png

[Предыдущая: Программирование модель/представление ] [Следующая: Использование моделей и представлений ]

Содержание

[править] Введение в программирование модель/представление

В Qt 4 введен новый набор классов для просмотра элементов использующих архитектуру модель/представление для управления взаимосвязью между данными и методом их представления пользователю. Разделение функциональности, введенное в этой архитектуре, дает разработчикам большую гибкость в настройке отображения элементов и предоставляет стандартный интерфейс модели, позволяющий широкому диапазону источников данных использовать существующие представления элементов. В этом документе мы дадим краткое описание парадигмы модель/представление, выделим концепции и опишем архитектуру системы представления элементов. Каждый компонент данной архитектуры будет описан и будут предоставлены примеры, показывающие как использовать предоставленные классы.

[править] Архитектура модель/представление

Архитектура Модель-Представление-Контроллер (Model-View-Controller, MVC) является шаблоном проектирования, берущим начало от Smalltalk, который часто используется для создания пользовательских интерфейсов. В Design Patterns, Gamma и других написано:

MVC состоит из трех типов объектов. Модель - объект приложения, представление - его экранное представление и контроллер - определяет реакцию пользовательского интерфейса на пользовательский ввод. До MVC при разработке пользовательского интерфейса эти объекты смешивались вместе. MVC разделяет их, для увеличения гибкости и возможности повторного использования.

Если объединить объекты представления и контроллера, то в результате получится архитектура модель/представление. Это все еще отделяет способ хранения данных от способа их представления пользователю, но обеспечивает простую структуру, основанную на тех же принципах. Данное разделение дает возможность показать пользователю одни и те же данных в различных видах без изменения структуры данных. Чтобы обеспечить гибкость управления пользовательским вводом, мы представляем концепцию делегата (delegate). Преимущество наличия делегата в этой структуре состоит в том, что это дает возможность для настройки представления и редактирования элементов данных.


center Архитектура модель/представление

Данная модель осуществляет соединение с источником данных, предоставляя необходимый интерфейс другим компонентам архитектуры. Характер связи зависит от источника данных и способа использования модели.

Представление получает индексы от модели, являющиеся ссылками на элементы данных. Получая индексы от модели, представление может получить данные от источника.

В стандарных представлениях делегат отображает элементы данных. Когда запись изменена, делегат связывается с моделью, которая использует непосредственно индексы.

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

Модели, представления и делегаты взаимодействуют друг с другом используя сигналы и слоты:

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

[править] Модели

Все модели элементов основаны на классе 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