MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Модели-Посредники в Qt
20.03.2016
22:41
Текстовые метки: Qt, модель, вид, proxy, посредник, сортировка, фильтрация
Раздел: Компьютер - Программирование - Язык C++ - Библиотека Qt - Принципы написания кода

Модели-Посредники

Обзор

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

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

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


Использование Моделей-Посредников

Модели-посредники могут быть вставлены между существующей моделью и любым количеством представлений. Qt предоставляет стандартную модель-посредник QSortFilterProxyModel, которая может использоваться как сама по себе, так и служить основой для подклассов, реализующих собственные способы фильтрации и сортировки. Класс QSortFilterProxyModel может использоваться следующим образом:

  QSortFilterProxyModel *filterModel = new QSortFilterProxyModel(parent);

filterModel->setSourceModel(stringListModel);


QListView *filteredView = new QListView;

filteredView->setModel(filterModel);


Так как модели-посредники являются наследниками QAbstractItemModel, они могут быть соединены с представлением любого вида и быть разделенными между представлениями. Также они могут использоваться для обработки данных, полученных от другой модели-посредника.

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


Настройка Моделей-Посредников

Обработка данных моделью-посредником включает в себя и перемещение каждого элемента данных относительно его изначального расположения в модели данных. В некоторых моделях, отдельные элементы могут не обрести соответствующего расположения в модели-посреднике; такие модели являются фильтрующими моделями-посредниками. Представления работают с элементами данных, используя модельные индексы, полученные от модели-посредника и не имеют никакого представления относительно расположения элементов в модели данных.

QSortFilterProxyModel позволяет отсортировать данные перед предоставлением их представлению, а также позволяет предоставить представлению несортированные данные.


Собственные Фильтрующие Модели

Класс QSortFilterProxyModel предоставляет довольно универсальную фильтрующую модель, которая может использоваться в самых разных ситуациях. Продвинутые пользователи, для реализации собственных механизмов фильтрации, могут создать подкласс QSortFilterProxyModel.

Подкласс QSortFilterProxyModel может повторно реализовать две виртуальные функции, которые вызываются всякий раз, когда требуется или используется модельный индекс от модели-посредника:

  • filterAcceptsColumn() используется для фильтрации определенных колонок исходной модели.
  • filterAcceptsRow() используется для фильтрации определенных строк исходной модели.

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


Собственные Сортирующие Модели

Для установки порядка элементов исходной модели, экземпляры QSortFilterProxyModel используют встроенную в Qt функцию qStableSort(), тем самым позволяя представлению получить иерархию элементов без изменения структуры исходной модели. Для воплощения собственного метода сортировки, заново реализуйте функцию lessThan(), в которой пропишите свои правила сравнения.


Так же в этом разделе:
← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования