Модель - Вид - Контроллер в Qt

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

  • QAbstractItemModel
  • QAbstractItemView
  • QAbstractItemDelegate/QItemDelegate

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

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

Ответ 1

AbstractItemModel QAbstractItemView QAbstractItemDelegate

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

QAbstractItemModel

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

QAbstractItemView

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

QAbstractItemDelegate

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


QGraphicsScene/QGraphicsView

Из "Graphics View Framework" и не зависит от структуры Model/View.
Это также очень мощная структура для графической части.

Сцена

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

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

Просмотр

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


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

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

элементы в сцене. Не забывайте следить за reset событиями изменения компоновки.