Как использовать фреймворк Qt Model/View с фреймворком Graphics View
Я работаю над приложением отображения и должен отображать объекты данных, используя таблицу, форму и графические объекты на карте. Я использую PyQt, но это не очень важно, так как это вопрос Qt, а не вопрос Python.
Если бы мне нужны были только таблицы и формы, это было бы легко, я бы просто использовал Qt Model/View framework. Однако мне нужен вид карты, чтобы обеспечить функциональность, действительно доступную только с помощью Graphics View framework, которая по сути собственная структура модели / представления с QGraphicsScene, действующей в качестве модели данных.
Я могу придумать два способа сделать это. Можно было бы начать с авторитетной модели подкласса из QAbstractItemModel, связать ее с подклассом QAbstractItemView и оттуда генерировать и обновлять QGraphicsItems в сцене. Это выглядит уродливо, потому что я не уверен, как обрабатывать взаимодействие с пользователем и изменения в элементах данных, хотя взаимодействие с QGraphicsItems.
в другой способ, который я могу придумать, - это рассматривать QGraphicsScene как авторитетный источник данных, сохраняя объект данных в каждом QGraphicsItem .свойство Data. Затем я бы подкласс QAbstractItemModel и написать его так, чтобы он обращается к данным в сцене, как это хранилище данных, другие представления будут использовать это в качестве своей модели. Как бы я распространил изменения на данные в сцене до модели?
какой бы подход я ни принял, похоже, что есть пробел, не обрабатываемый интегрированные системы. В модели/представлении предполагается, что все изменения вносятся в модель. В графическом представлении предполагается, что все изменения будут внесены в сцену.
Так какой подход вы выберете помощью переопределенной QAbstractItemModel(авторитетный)->QAbstractItemView->на qgraphicsscene или на qgraphicsscene(авторитетный)->помощью переопределенной QAbstractItemModel-> "другие представления". Почему бы вам выбрать один над другим и какие проблемы вы предвидите? Кто-нибудь еще должен был преодолеть этот разрыв между двойной моделью/представлением Qt и как вы это сделали?
1 ответов
QAbstractItemModel(авторитетный) - >QAbstractItemView - >QGraphicsScene
без сомнения. Я делал это раньше, это требует немного дублирования (по крайней мере, некоторых, которых я не мог избежать), но ничего плохого.
это также позволяет вам представлять ваши данные в стандартных представлениях вместе со сценой, которая довольно приятна.
мой лучший совет-хранить QHash
of QPersistantModelIndex
to QGraphicsItem
и QGraphicsScene
на QAbstractItemView
создать. Это позволяет быстро перейти между моделью / видом Земли (QModelIndex
) для графического просмотра земли (QGraphicsItem
)