Hallo ihr,
Ich habe QGraphicsItems mit Flag ItemIsMovable == true , und einige mit == false, beide aber selektierbar.
Wenn ein verschiebbares Item verschoben wird und zugleich nicht verschiebbare Items selektiert sind kommt es zum Crash bei QGraphicsItem::mouseMoveEvent, da QT in dieser Routine am Anfang alle selektierten Objekte in eine Liste schmeisst und dann in einer Schleife nach und nach durchgeht ohne Rücksicht, ob denn nicht das Item inzwischen gelöscht wurde.
Da ich aber beim Verschieben von beweglichen Items, andere Items während des Verschiebens lösche kommt es zum Absturz
Weiss jemand ein Problem für meine Lösung?
lg Michael
Löschen von selektierten Items während MouseMove -> Crash
Re: Löschen von selektierten Items während MouseMove -> C
Das ist hoffentlich nicht ernst gemeintmikemc hat geschrieben:Weiss jemand ein Problem für meine Lösung?
Ansonsten sichergehen, dass Qt es nicht mehr als selektiert hält:
http://qt.nokia.com/doc/4.6/qgraphicsit ... etSelected
Also etwa so:
Code: Alles auswählen
item->setSelected(false);
delete item;Letzteres sollte eigentlich helfen, da ich denke bei Nokia sitzen keine Trottel, die werden schon verhindern dass ein Item, sobald es nicht mehr in der Scene ist, nocht verwendet wird...
Falls nicht kannst du schauen ob es was bringt von QGraphicsObject abzuleiten und item->deleteLater();, damit in dieser Eventloop-Runde nichts böses mehr mit dem Item geschehen kann.
Sollte das immer noch nicht helfen -> Bugreport!
hallo franzf,Das ist hoffentlich nicht ernst gemeint
ernster als Ernst
das passiert ehVllt. vorher noch aus der Scene entfernen.
daran zweifle ich sehr...die werden schon verhindern dass ein Item, sobald es nicht mehr in der Scene ist, noch verwendet wird...
wenns nicht anders geht vlcht eine variante, allerdings möchte ich möglichst vermeiden ein QGraphicsObject für jedes QGraphicsItem zu verwenden, da ich sehr viele Objekte in der Scene habekannst du schauen ob es was bringt von QGraphicsObject abzuleiten und item->deleteLater();
Hallo upsala,Pack alle deine zu löchenden Items in eine Liste (event. gleich noch eine hide() darauf)
Überschreib QGraphicsScene::event und lösch dort deine Items.
guter tipp,
problem ist, dass QGraphicsScene::event() vor QGraphicsScene::mouseMoveEvent aufgerufen wird
@mikemc
Dann wollen wir das ganze mal schön verschachtelt malen:
*) Hier könnte man auch löschen...
Dann wollen wir das ganze mal schön verschachtelt malen:
Code: Alles auswählen
QGraphicsScene::event() {
//*)
QGraphicsScene::mouseMoveEvent() {
QGraphicsItem::itemChange() {
// hier werden Objekte in die Liste eingetragen
}
}
//und hier werden die Elemente der Liste gelöscht...
}