Estoy trabajando en una aplicación de mapeo y necesito mostrar los objetos de datos usando una tabla, un formulario y objetos gráficos en el mapa. Estoy usando PyQt, pero eso no es realmente importante, ya que es una pregunta de Qt y no de Python.Cómo usar Qt Model/View framework con el marco Graphics View
Si solo necesitara la tabla y formara las vistas, sería fácil, solo usaría el marco Qt Model/View. Sin embargo, necesito la vista de mapa para proporcionar la funcionalidad que realmente está realmente disponible usando el marco de vista de gráficos, que es esencialmente su propio marco de modelos/vistas con QGraphicsScene actuando como el modelo de datos.
Puedo pensar en dos formas de hacerlo. Una sería comenzar con un modelo autorizado subclasificado de QAbstractItemModel, vincularlo a una subclase de QAbstractItemView y a partir de allí generar y actualizar QGraphicsItems en la escena. Sin embargo, esto parece feo porque no estoy seguro de cómo manejar la interacción del usuario y los cambios en los elementos de datos a través de la interacción con QGraphicsItems.
La otra forma en que puedo pensar es tratar el QGraphicsScene como la fuente de datos autorizada, almacenando el objeto de datos en la propiedad .data() de cada QGraphicsItem. Luego, subclase QAbstractItemModel y lo escribo para que acceda a los datos en la escena como su almacén de datos, las otras vistas lo usarían como su modelo. Sin embargo, ¿cómo podría propagar los cambios en los datos en la escena hasta el modelo?
Cualquiera que sea el enfoque que tome, parece que hay una brecha no manejada por los marcos. En Modelo/Vista, se supone que todos los cambios se realizan en el modelo. En la Vista de gráficos, se supone que todos los cambios se realizan en la escena.
Entonces, ¿qué enfoque elegiría QAbstractItemModel (autoritativo) -> QAbstractItemView-> QGraphicsScene o alternativamente QGraphicsScene (autoritativo) -> QAbstractItemModel-> Otras vistas. ¿Por qué elegirías uno sobre el otro y qué trampas anticipas? ¿Alguien más ha necesitado cerrar esta brecha entre los marcos gemelos de modelo/vista de Qt y cómo lo hiciste?
Este es el enfoque con el que comencé, antes de darme cuenta de que podía hacerlo al revés. Supongo que los únicos métodos de AQbstractItemView que necesitaría para la subclase son dataChanged(), rowsInserted() y rowsAboutToBeRemoved()? A continuación, gestione los elementos de la escena de forma adecuada. Supongo que almacenaré QPersistentModelIndexes en QGraphicsItems. Me gusta la idea de QHash. Estoy usando PyQT, así que usaría un diccionario de Python, pero es una buena optimización de cualquier manera. –
@Simon: Sí, creo que lo tienes, en dataChanged() es posible que tengas que duplicar parte del código de QGraphicsScene en función de tus datos y representación, pero una vez más, debe ser menor si alguno. –
Lo tengo trabajando, en un nivel básico. ¡Hurra! –