2009-07-13 5 views
1

Ich habe eine Anwendung, die einen Editor für ein Diagramm mit QGraphicsScene-Objekt anzeigt. Ich möchte eine Read-Only-Version des gleichen Dialogs erstellen, aber die Möglichkeit für den Benutzer, beide gleichzeitig zu sehen.Gemeinsame Nutzung des gleichen Modells in zwei QGraphicScene-Instanzen in 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); 

Wenn ich erstellen 2 Instanzen von QGraphicsScene und verwenden addItem auf dem zweiten es alle Elemente aus dem ersten entfernt. Unterstützt Qt jede Art von Model-Sharing zwischen Szenen? Ist meine einzige Wahl dieselbe Szene zu haben und zu versuchen, die Ansicht anzupassen? Später scheint es nicht zu funktionieren, da Objektauswahlinformationen innerhalb der Grafikelemente liegen, die freigegeben werden. Wenn ich also Flags auf ihnen deaktiviere, werden sie nur in beiden Ansichten gelesen. Jeder Rat wird geschätzt. Vielen Dank.

Antwort

0

Ich denke, dass Sie QSceneItems in Modellklassen speichern. Aus diesem Grund versuchen pScene1 und pScene2, nicht nur das Modell selbst, sondern auch die Szenenelemente zu teilen. Dies funktioniert nicht, weil ein Szenenobjekt can be placed only on one scene at any given moment.

Wie es zu beheben? Machen Sie dem Modell keine GUI bekannt. Lasse es geänderte() Benachrichtigungen ausgeben, wenn etwas Interessantes passiert.

Dann lassen Sie jedes SimScene-Modell in beliebige QSceneItems einhüllen und geänderte() Benachrichtigungen verarbeiten.

Beispiel:

Modell: Graph, Rand, Vertex
GUI SimScene, QEdge, QVertex, QSimInfo, Qbackground, und so weiter ...

+0

Sie haben Recht. Das vorhandene System hat Modellelemente als GUI-Elemente und deshalb werden sie beim Hinzufügen zum zweiten Objekt aus der ersten Szene entfernt. Ich werde versuchen, sie zu trennen. Vielen Dank. –

1

Wenn Sie nur eine interaktive und eine schreibgeschützte Ansicht auf Ihrem Modell möchten Sie können eine einzelne QGraphicsScene und 2 QGraphicsViews verwenden. Sie müssen nur QGraphicsView :: setInteractive (false) auf einem von ihnen aufrufen. Auf diese Weise müssen Sie keine Elementflags ändern.