Je travaille sur une application de cartographie et j'ai besoin d'afficher les objets de données en utilisant une table, un formulaire et des objets graphiques dans la carte. J'utilise PyQt, mais ce n'est pas vraiment important car c'est une question Qt pas une question Python.Comment utiliser le framework Qt Model/View avec la structure Graphics View
Si j'avais seulement besoin de la vue de la table et du formulaire, ce serait facile, j'utiliserais simplement le framework Qt Model/View. Cependant j'ai besoin de la vue de carte pour fournir la fonctionnalité seulement réellement disponible en utilisant le cadre de vue de graphiques, qui est essentiellement son propre cadre modèle/vue avec le QGraphicsScene agissant en tant que modèle de données.
Je peux penser à deux façons de le faire. L'une serait de commencer avec un modèle faisant autorité sous-classé de QAbstractItemModel, le lier à une sous-classe de QAbstractItemView et de là générer et mettre à jour QGraphicsItems dans la scène. Cela semble moche cependant parce que je ne suis pas sûr de savoir comment gérer l'interaction de l'utilisateur avec et modifie les éléments de données par l'interaction avec les QGraphicsItems. L'autre façon que je peux penser à faire est de traiter QGraphicsScene comme la source de données faisant autorité, en stockant l'objet de données dans la propriété .data() de chaque QGraphicsItem. Ensuite, je sous-classe QAbstractItemModel et l'écris pour qu'il accède aux données de la scène en tant que stockage de données, les autres vues l'utilisent ensuite comme modèle. Comment puis-je propager les modifications apportées aux données dans la scène jusqu'au modèle? Quelle que soit l'approche que je prenne, il semble qu'il y ait un vide non géré par les frameworks. Dans Model/View, toutes les modifications sont supposées être effectuées dans le modèle. Dans Graphics View, toutes les modifications sont supposées être effectuées dans la scène.
Alors quelle approche choisiriez-vous QAbstractItemModel (faisant autorité) -> QAbstractItemView-> QGraphicsScene ou bien QGraphicsScene (faisant autorité) -> QAbstractItemModel-> Other Views. Pourquoi choisiriez-vous l'un par rapport à l'autre et quels sont les pièges anticipés? Quelqu'un d'autre a-t-il eu besoin de combler ce fossé entre les cadres de modèles/vues jumeaux de Qt et comment l'avez-vous fait?
C'est l'approche que j'ai commencé, avant de réaliser que je pouvais le faire dans l'autre sens. Je devine que les seules méthodes de AQbstractItemView que je devrais sous-classer sont dataChanged(), rowsInserted() et rowsAboutToBeRemoved()? Ensuite, gérez les éléments de la scène de manière appropriée. Je pense que je vais stocker QPersistentModelIndexes dans les QGraphicsItems. J'aime l'idée de QHash. J'utilise PyQT donc j'utiliserais un dictionnaire Python, mais c'est une bonne optimisation de toute façon. –
@Simon: Oui, je pense que vous l'avez, dans dataChanged(), vous devrez peut-être dupliquer une partie du code de QGraphicsScene en fonction de vos données et de la représentation, mais encore une fois, il devrait être mineur. –
J'ai commencé à travailler, à un niveau de base. Yay! –