Problem mit QGraphicsScene und Mouse Events
Verfasst: 18. April 2013 13:24
Hallo liebe Forengemeinde!
Ich bin seit einiger Zeit glücklicher Qt-User und habe ein Problem in einem meiner Projekte.
Meine Applikation besteht aus mehreren Plugins, deren Properties untereinander verlinkt werden können. Um dies graphisch darzustellen, habe ich jeweils eine von QGraphicsItem abgeleitete Klasse für die Plugins und für die Verbindungslinien zwischen ihnen. (siehe Screenshot).
Beide Objekte werden in einer Liste gehalten:
std::list<QGraphicalEditorWidget*> widgets;
std::list<QGraphicalEditorLink*> links;
Beim Laden einer Projektdatei werden für alle Plugins Widgets in der Liste erstellt und der QGraphicsScene hinzugefügt, das gleiche gilt für die Link-Objekte.
Die Widgets und Links reagieren auf Maus-Events (Hover, Klick).
Wenn ich dann ein neues Projekt laden will (zB. das gleiche nochmal), werden zunächst alle Widgets und Links aus der Szene entfernt und die Liste geleert. Dann kommt noch sicherheitshalber ein scene.clear(), und danach werden wird die Szene mit den neuen Items befüllt. (siehe Code)
Das Problem: Beim Neuladen einer Szene, die ich schon einmal geladen habe, reagieren die Link-Items nichtmehr auf irgendwelche Maus-Events, die Widgets aber schon, obwohl das Datenmanagement bei beiden gleich ist. Wenn ich dann einen neuen Link zwischen zwei Widgets erstelle und sich die Szene somit ändert, funktioniert auf einmal wieder alles.
Dieses Verhalten tritt immer auf, wenn ich ein Projekt lade, dass ich (in derselben Debug-Session) schon einmal geladen habe, auch wenn ich dazwischen ein oder mehrere Projekte lade.
Was kann da falsch sein? Bin für jede Hilfe dankbar!
Hier der Code zum Löschen:
Ich bin seit einiger Zeit glücklicher Qt-User und habe ein Problem in einem meiner Projekte.
Meine Applikation besteht aus mehreren Plugins, deren Properties untereinander verlinkt werden können. Um dies graphisch darzustellen, habe ich jeweils eine von QGraphicsItem abgeleitete Klasse für die Plugins und für die Verbindungslinien zwischen ihnen. (siehe Screenshot).
Beide Objekte werden in einer Liste gehalten:
std::list<QGraphicalEditorWidget*> widgets;
std::list<QGraphicalEditorLink*> links;
Beim Laden einer Projektdatei werden für alle Plugins Widgets in der Liste erstellt und der QGraphicsScene hinzugefügt, das gleiche gilt für die Link-Objekte.
Die Widgets und Links reagieren auf Maus-Events (Hover, Klick).
Wenn ich dann ein neues Projekt laden will (zB. das gleiche nochmal), werden zunächst alle Widgets und Links aus der Szene entfernt und die Liste geleert. Dann kommt noch sicherheitshalber ein scene.clear(), und danach werden wird die Szene mit den neuen Items befüllt. (siehe Code)
Das Problem: Beim Neuladen einer Szene, die ich schon einmal geladen habe, reagieren die Link-Items nichtmehr auf irgendwelche Maus-Events, die Widgets aber schon, obwohl das Datenmanagement bei beiden gleich ist. Wenn ich dann einen neuen Link zwischen zwei Widgets erstelle und sich die Szene somit ändert, funktioniert auf einmal wieder alles.
Dieses Verhalten tritt immer auf, wenn ich ein Projekt lade, dass ich (in derselben Debug-Session) schon einmal geladen habe, auch wenn ich dazwischen ein oder mehrere Projekte lade.
Was kann da falsch sein? Bin für jede Hilfe dankbar!
Hier der Code zum Löschen:
Code: Alles auswählen
void QGraphicalEditor::clear(void)
{
links.clear();
while(!widgets.empty())
{
QGraphicalEditorWidget * tempwidget = (QGraphicalEditorWidget*)*widgets.begin();
scene.removeItem(tempwidget);
widgets.pop_front();
delete tempwidget;
}
layout->init();
scene.clear();
}
Code: Alles auswählen
void QGraphicalEditorLinkManager::clear(void)
{
if(links.size()>0)
{
QGraphicalEditor *gEditor = QVolumeShopApplication::Get()->GetMainframe()->GetGraphicalEditor();
while(!links.empty())
{
QGraphicalEditorLink * litem = (QGraphicalEditorLink*)*links.begin();
gEditor->removeLinkFromLayout(litem); //Lösche die Kante aus der Layout-Klasse
gEditor->getScene()->removeItem(litem); //Aus der Szene entfernen
links.pop_front(); //aus der Liste nehmen
delete litem; //Element löschen
}
}
}