Как использовать структуру Qt Model/View с рамкой Graphics View
Я работаю над приложением сопоставления и должен отображать объекты данных, используя таблицу, форму и графические объекты на карте. Я использую PyQt, но это не очень важно, так как это вопрос Qt, а не вопрос Python.
Если мне нужны только таблицы и формы, это было бы легко, я бы просто использовал структуру Qt Model/View. Однако мне нужно, чтобы представление карты обеспечивало функциональность, действительно доступную только с помощью инфраструктуры графического представления, которая по существу является собственной структурой Model/View с QGraphicsScene, действующей как модель данных.
Я могу придумать два способа сделать это. Можно было бы начать с авторитарной модели, подклассифицированной из QAbstractItemModel, связать ее с подклассом QAbstractItemView и оттуда создать и обновить QGraphicsItems в сцене. Это выглядит уродливым, хотя я не уверен, как обрабатывать взаимодействие с пользователем и изменять элементы данных, хотя взаимодействие с QGraphicsItems.
Другим способом, который я могу сделать, это обработать QGraphicsScene как авторитетный источник данных, сохраняя объект данных в каждом свойстве QGraphicsItem.data(). Затем я подклассифицировал QAbstractItemModel и напишу его так, чтобы он обращался к данным в сцене, как к хранилищу данных, тогда другие представления использовали бы это как свою модель. Как я могу распространять изменения в данных в сцене до модели?
Какой бы подход ни применялся, похоже, что недостатки не обрабатываются инфраструктурой. В Model/View все изменения предполагаются выполненными в модели. В Graphics View все изменения предполагаются выполненными в сцене.
Итак, какой подход вы бы выбрали QAbstractItemModel (авторитетный) → QAbstractItemView- > QGraphicsScene или, альтернативно, QGraphicsScene (авторитетный) → QAbstractItemModel- > Другие виды. Почему вы выбираете один за другим и какие вы ожидаете? Кто-нибудь еще должен был преодолеть этот разрыв между Qt twin model/view frameworks и как вы это сделали?
Ответы
Ответ 1
QAbstractItemModel (авторитетный) → QAbstractItemView- > QGraphicsScene
Без сомнения. Я сделал это раньше, это требует немного дублирования (по крайней мере, некоторых, которых я не мог избежать), но ничего плохого.
Это также позволяет вам представлять ваши данные в стандартных представлениях вместе со сценой, которая довольно приятна.
Мой лучший совет - сохранить QHash
QPersistantModelIndex
до QGraphicsItem
и QGraphicsScene
в QAbstractItemView
, который вы создаете. Это позволяет быстро перемещаться между Землей модели/просмотра (QModelIndex
) в Графический вид земли (QGraphicsItem
)