diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2022-08-15 14:36:29 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2022-08-22 08:03:43 +0000 |
commit | 5e6ad51e972bbc1fb937269be73f5555f64e2986 (patch) | |
tree | d52f951d72fae145e310c7ebdef65278644e2771 | |
parent | dc8e13995ab43fd1c05ec40ea876f5208869aa38 (diff) | |
download | qt-creator-5e6ad51e972bbc1fb937269be73f5555f64e2986.tar.gz |
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: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Artem Sokolovskii <artem.sokolovskii@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
-rw-r--r-- | src/plugins/scxmleditor/plugin_interface/connectableitem.cpp | 12 | ||||
-rw-r--r-- | src/plugins/scxmleditor/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 5132f19038..6fe6899fa3 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<ConnectableItem *> overlappedItems = m_overlappedItems; + for (ConnectableItem *item : overlappedItems) item->removeOverlappingItem(this); m_overlappedItems.clear(); - for (TransitionItem *transition : qAsConst(m_outputTransitions)) + const QList<TransitionItem *> outputTransitions = m_outputTransitions; + for (TransitionItem *transition : outputTransitions) transition->disconnectItem(this); m_outputTransitions.clear(); - for (TransitionItem *transition : qAsConst(m_inputTransitions)) + const QList<TransitionItem *> 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<QGraphicsItem *> items = childItems(); + for (QGraphicsItem *it : items) { auto item = static_cast<ConnectableItem*>(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 bd90d3f846..365038a476 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()); |