2009-07-13 9 views
1

J'ai une application qui affiche un éditeur pour un diagramme en utilisant l'objet QGraphicsScene. Je voudrais créer une version en lecture seule de la même boîte de dialogue, mais avoir la possibilité pour l'utilisateur de voir les deux en même temps.Partage du même modèle dans deux instances QGraphicScene dans Qt

SimScene* pScene1 = new SimScene(model); // adds model to scene 
SimScene* pScene2 = new SimScene(model); // adds model to scene 
QGraphicsView* pView1 = new QGraphicsView(); 
pView1->setScene(pScene2); 
QGraphicsView* pView1 = new QGraphicsView(); 
pView2->setScene(pScene2); 

Lorsque je crée 2 cas de QGraphicsScene et utiliser addItem sur le second, il supprime tous les éléments de la première. Qt prend-il en charge tout type de partage de modèle entre les scènes? Mon seul choix est-il d'avoir la même scène et d'essayer de personnaliser la vue? Plus tard, il ne semble pas fonctionner parce que les informations de sélection d'objets sont dans les éléments graphiques partagés, donc si je les désactive, ils ne sont lus que dans les deux vues. Tout conseil est apprécié. Merci.

Répondre

0

Je pense que vous stockez QSceneItems dans les classes du modèle. A cause de cela, pScene1 et pScene2 essaient de partager non seulement le modèle lui-même, mais aussi les éléments de la scène. Cela ne fonctionnera pas car n'importe quel élément de la scène can be placed only on one scene at any given moment.

Comment le réparer? Rendre le modèle non averti d'une interface graphique. Laissez-le émettre des notifications changed() chaque fois que quelque chose d'intéressant se produit. Ensuite, laissez chaque SimScene envelopper le modèle dans les QSceneItems souhaités et traiter les notifications changed().

Exemple:

Modèle: Graphique, Edge, Vertex
GUI SimScene, QEdge, QVertex, QSimInfo, Qbackground, et ainsi de suite ...

+0

Vous avez raison. Le système existant a des éléments de modèle en tant qu'éléments d'interface graphique et c'est pourquoi ils finissent par être supprimés de la première scène en plus de la seconde. Je vais essayer de les séparer. Merci. –

1

Si vous voulez juste une vue interactive et en lecture seule sur votre modèle vous pouvez utiliser un seul QGraphicsScene et 2 QGraphicsViews. Vous devez juste appeler QGraphicsView :: setInteractive (false) sur l'un d'entre eux. De cette façon, vous n'avez pas besoin de changer les drapeaux d'objets.

Questions connexes