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

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

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

__NOTOC__

Image:qt-logo.png

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

Image:trolltech-logo.png

[Предыдущая: Использование Drag and Drop с представлениями элементов ] [ Содержание ] [Следующая: Создание собственных моделей ]

Содержание

[править] Модели-посредники

[править] Краткий обзор

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

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

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

[править] Использование моделей-посредников

Модели-посредники могут быть вставлены между существующей моделью и любым количеством представлений. 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(), в которой пропишите свои правила сравнения.

[Предыдущая: Использование Drag and Drop с представлениями элементов ] [ Содержание ] [Следующая: Создание собственных моделей ]



Copyright © 2007 Trolltech Trademarks
Qt 4.3.2