From 5e6ad51e972bbc1fb937269be73f5555f64e2986 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 15 Aug 2022 14:36:29 +0200 Subject: [PATCH] ScxmlEditor: Fix a crash when closing scxml editor Don't iterate on m_overlappedItems inside d'tor, as every iteration calls removeOverlappingItem() and it modifies the container being iterated. Do the same for m_outputTransitions and m_inputTransitions. Amends 8b444f88eb6cf37fcfbae8ae8d7388a43fcb78fb Fixes: QTCREATORBUG-28027 Change-Id: I78fe67b5ea584c969e4850a2db3f00d981296865 Reviewed-by: Reviewed-by: Artem Sokolovskii Reviewed-by: Alessandro Portale --- .../scxmleditor/plugin_interface/connectableitem.cpp | 12 ++++++++---- .../plugin_interface/scattributeitemdelegate.cpp | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/plugins/scxmleditor/plugin_interface/connectableitem.cpp b/src/plugins/scxmleditor/plugin_interface/connectableitem.cpp index 5132f19038b..6fe6899fa31 100644 --- a/src/plugins/scxmleditor/plugin_interface/connectableitem.cpp +++ b/src/plugins/scxmleditor/plugin_interface/connectableitem.cpp @@ -64,15 +64,18 @@ ConnectableItem::~ConnectableItem() { setBlockUpdates(true); - for (ConnectableItem *item : qAsConst(m_overlappedItems)) + const QList overlappedItems = m_overlappedItems; + for (ConnectableItem *item : overlappedItems) item->removeOverlappingItem(this); m_overlappedItems.clear(); - for (TransitionItem *transition : qAsConst(m_outputTransitions)) + const QList outputTransitions = m_outputTransitions; + for (TransitionItem *transition : outputTransitions) transition->disconnectItem(this); m_outputTransitions.clear(); - for (TransitionItem *transition : qAsConst(m_inputTransitions)) + const QList inputTransitions = m_inputTransitions; + for (TransitionItem *transition : inputTransitions) transition->disconnectItem(this); m_inputTransitions.clear(); @@ -310,7 +313,8 @@ void ConnectableItem::updateTransitions(bool allChildren) updateInputTransitions(); if (allChildren) { - for (QGraphicsItem *it : childItems()) { + const QList items = childItems(); + for (QGraphicsItem *it : items) { auto item = static_cast(it); if (item && item->type() >= InitialStateType) item->updateTransitions(allChildren); diff --git a/src/plugins/scxmleditor/plugin_interface/scattributeitemdelegate.cpp b/src/plugins/scxmleditor/plugin_interface/scattributeitemdelegate.cpp index bd90d3f8463..365038a476a 100644 --- a/src/plugins/scxmleditor/plugin_interface/scattributeitemdelegate.cpp +++ b/src/plugins/scxmleditor/plugin_interface/scattributeitemdelegate.cpp @@ -80,7 +80,7 @@ void SCAttributeItemDelegate::setEditorData(QWidget *editor, const QModelIndex & combo->clear(); const QStringList values = index.data(DataRole).toString().split(";"); - for (QString val : values) + for (const QString &val : values) combo->addItem(val); combo->setCurrentText(index.data().toString());