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