Hallo,
ich möchte Kanten und Knoten hinzufügen und löschen.
Mir ist schon gelungen, Kanten und Knoten hinzuzufügen.
Jetzt versuche ich, Kanten und Knoten zu löschen, aber es klappt nicht.
Ich weiß, dass alle mit dem Knoten verbundene Kanten gelöscht werden sollen, bevor ein Knoten gelöscht wird.
Deshalb lösche ich zuerst alle verbundenen Kanten.
Es klappt, aber wenn ich danach einen Knoten bewege oder einen neuen Knoten einfüge,
bekomme ich einen segmentation fault:
########################################################################################
(gdb) info thread
* 1 Thread 47886270060288 (LWP 30506) 0x00002b8d61c2c7fc in QGraphicsItem::mapToScene () from /usr/lib/libQtGui.so.4
(gdb) backtrace
#0 0x00002b8d61c2c7fc in QGraphicsItem::mapToScene () from /usr/lib/libQtGui.so.4
#1 0x00002b8d61c2c88e in QGraphicsItem::mapFromItem () from /usr/lib/libQtGui.so.4
#2 0x0000000000407dd4 in QGraphicsItem::mapFromItem (this=0x5bcef0, item=0x5bddd0, ax=0, ay=0) at /usr/include/qt4/QtGui/qgraphicsitem.h:301
#3 0x0000000000406b26 in Edge::adjust (this=0x5bcef0) at edge.cpp:53
#4 0x000000000040b9fe in Node::itemChange (this=0x5bdd30, change=QGraphicsItem::ItemPositionChange, value=@0x7fff494cf4c0) at node.cpp:153
#5 0x00002b8d61c30f84 in QGraphicsItem::setPos () from /usr/lib/libQtGui.so.4
#6 0x00002b8d61c3138e in QGraphicsItem::mouseMoveEvent () from /usr/lib/libQtGui.so.4
#7 0x00002b8d61c2cda5 in QGraphicsItem::sceneEvent () from /usr/lib/libQtGui.so.4
#8 0x00002b8d61c3d2fe in QGraphicsScene::itemUpdated () from /usr/lib/libQtGui.so.4
#9 0x00002b8d61c3d922 in QGraphicsScene::clearFocus () from /usr/lib/libQtGui.so.4
#10 0x00002b8d61c428ed in QGraphicsScene::event () from /usr/lib/libQtGui.so.4
#11 0x00002b8d6185fccc in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4
#12 0x00002b8d61861d7d in QApplication::notify () from /usr/lib/libQtGui.so.4
#13 0x00002b8d61c4f32d in QGraphicsView::mouseMoveEvent () from /usr/lib/libQtGui.so.4
#14 0x00002b8d618a25ef in QWidget::event () from /usr/lib/libQtGui.so.4
#15 0x00002b8d61aefb49 in QFrame::event () from /usr/lib/libQtGui.so.4
#16 0x00002b8d61b5752a in QAbstractScrollArea::viewportEvent () from /usr/lib/libQtGui.so.4
#17 0x00002b8d61c5059e in QGraphicsView::viewportEvent () from /usr/lib/libQtGui.so.4
#18 0x00002b8d61b58858 in QAbstractScrollArea::setViewport () from /usr/lib/libQtGui.so.4
#19 0x00002b8d6185fc83 in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4
#20 0x00002b8d61862261 in QApplication::notify () from /usr/lib/libQtGui.so.4
#21 0x00002b8d618b30c1 in QApplication::x11ProcessEvent () from /usr/lib/libQtGui.so.4
#22 0x00002b8d618b1f90 in QApplication::x11ProcessEvent () from /usr/lib/libQtGui.so.4
#23 0x00002b8d618d3dc8 in QX11Info::copyX11Data () from /usr/lib/libQtGui.so.4
#24 0x00002b8d6334bc84 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
#25 0x00002b8d6334eacd in g_main_context_check () from /usr/lib/libglib-2.0.so.0
#26 0x00002b8d6334effe in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0
#27 0x00002b8d62f492c2 in QEventDispatcherGlib::processEvents () from /usr/lib/libQtCore.so.4
#28 0x00002b8d618d3bcf in QX11Info::copyX11Data () from /usr/lib/libQtGui.so.4
#29 0x00002b8d62f28008 in QEventLoop::processEvents () from /usr/lib/libQtCore.so.4
#30 0x00002b8d62f28119 in QEventLoop::exec () from /usr/lib/libQtCore.so.4
#31 0x00002b8d62f2a2e0 in QCoreApplication::exec () from /usr/lib/libQtCore.so.4
#32 0x000000000040b75c in main (argc=1, argv=0x7fff494d0ef8) at main.cpp:12
##########################################################################################
... es scheint, dass es ein Problem in 'mapToScene ()' gibt.
Aber ich verstehe nicht, genau was geschieht.
Wie kann man Kanten und Knoten löschen, ohne Fehler?
Kanten und Knoten zu löschen, ohne Fehler
Kanten und Knoten zu löschen, ohne Fehler
- Dateianhänge
-
- rm.tar.gz
- (5.18 KiB) 129-mal heruntergeladen
Hi Einhorn,
Also, wenn ich es richtig gesehen habe, ist Dein Hauptproblem in GraphWidget::removeNode(). Da liegt Einiges im Argen...
1. Zuerst löscht Du mit removeEdge() das erste Element in der edgeList der Klasse Node. Du prüfst jedoch garnicht, ob diese Liste überhaupt noch ein element enthält. Des weiteren vermute ich fast, dass die Funktion removeEdge() nicht nur ein element löschen soll, sondern alle. Guck mal bei QList, da gibts ne Funktion die leert die ganze Liste.
2. Nachdem Du das erste Element der edgeList gelöscht hast, willst Du mit removingNode->edges() alle edges haben... Aber die hast Du doch gerade aus der Liste in der Klasse Node gelöscht. Also sollte der Befehl zum Löschen der Edges aus der Liste des Nodes erst später erfolgen.
3. Du benutzt die Befehle items().removeAll( _currentNode ) und items().removeAll( removingNode->edges().first() ). Ich denke mal, Du möchtest damit die Nodes und Edges aus der QGraphicsScene entfernen. Das wird aber so nicht klappen, weil Du im Besten Fall nur die Pointer in der Liste, die mit items() zurückkommt, löschst. Kleiner Tip: Guck Dir mal die Funktion removeItem() von QGraphicsScene an, das dürfte das sein, was Du suchst.
Viel Spaß beim Coden
Also, wenn ich es richtig gesehen habe, ist Dein Hauptproblem in GraphWidget::removeNode(). Da liegt Einiges im Argen...
1. Zuerst löscht Du mit removeEdge() das erste Element in der edgeList der Klasse Node. Du prüfst jedoch garnicht, ob diese Liste überhaupt noch ein element enthält. Des weiteren vermute ich fast, dass die Funktion removeEdge() nicht nur ein element löschen soll, sondern alle. Guck mal bei QList, da gibts ne Funktion die leert die ganze Liste.
2. Nachdem Du das erste Element der edgeList gelöscht hast, willst Du mit removingNode->edges() alle edges haben... Aber die hast Du doch gerade aus der Liste in der Klasse Node gelöscht. Also sollte der Befehl zum Löschen der Edges aus der Liste des Nodes erst später erfolgen.
3. Du benutzt die Befehle items().removeAll( _currentNode ) und items().removeAll( removingNode->edges().first() ). Ich denke mal, Du möchtest damit die Nodes und Edges aus der QGraphicsScene entfernen. Das wird aber so nicht klappen, weil Du im Besten Fall nur die Pointer in der Liste, die mit items() zurückkommt, löschst. Kleiner Tip: Guck Dir mal die Funktion removeItem() von QGraphicsScene an, das dürfte das sein, was Du suchst.
Viel Spaß beim Coden