Модель - Вид - Контроллер в Qt - PullRequest
12 голосов
/ 17 июня 2009

Я более или менее понимаю, как работает MPV. Но я не понимаю, какие классы:

  • QAbstractItemModel
  • QAbstractItemView
  • QAbstractItemDelegate / QItemDelegate

Может сделать для меня?

Если это актуально, я использую QGraphicsScene / QGraphicsView с некоторыми элементами (визуальное представление игрового поля), с которыми пользователь может взаимодействовать, в то время как логика взаимодействия (правила игры) инкапсулирована в другом классе.

1 Ответ

13 голосов
/ 17 июня 2009

AbstractItemModel QAbstractItemView QAbstractItemDelegate

Из "Рамки режима / просмотра"
Это очень мощный фреймворк для части данных вашего приложения, здесь - представление фреймворка.

QAbstractItemModel

Базовый класс для модели MVC . Имеет глобальный интерфейс для доступа и изменения данных и заботится о наблюдаемой части.

QAbstractItemView

Базовый класс для представления MVC . Имеет aglobal интерфейс для части просмотра / выбора, и он заботится о части Observer. Вам не нужно беспокоиться о шаблоне наблюдателя, фреймворк сделает это за вас.

QAbstractItemDelegate

Базовый класс для контроллера MVC .
Это шаблон стратегии для рисования, редактирования элементов, ...


QGraphicsScene / QGraphicsView

Из "Каркаса графического представления" и не зависит от каркаса Модель / представление.
Это также очень мощный фреймворк для графической части.

Сцена

QGraphicsScene предоставляет графику Просмотр сцены. Сцена имеет следующие обязанности:

Обеспечение быстрого интерфейса для управление большим количеством предметов Распространение событий на каждый предмет Управление состоянием элемента, такое как выбор и фокусировка нетрансформированная функциональность рендеринга; в основном для печати

Вид

QGraphicsView обеспечивает представление виджет, который визуализирует содержимое сцены. Вы можете прикрепить несколько взгляды на ту же сцену, чтобы обеспечить несколько видов на одни и те же данные набор


Если вы хотите, чтобы Модель была видимой в QGraphicsView, вам придется написать свое собственное представление на основе QAbstractItemView.
Возьмите QGraphicsView в качестве виджета порта просмотра QAbstractScrollArea::setViewport(QWidget * widget)), и тогда вы сможете

  • add QAbstractItemView::rowsInserted,
  • удалить QAbstractItemView::rowsAboutToBeRemoved
  • и изменить QAbstractItemView::dataChanged

предметы на сцене. Не забудьте позаботиться о сбросе событий изменения макета.

...