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