From d7997f16a703990c1519bcf87806e44fb0ec73fa Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Sat, 24 Aug 2013 20:06:11 +0200 Subject: [PATCH] Delay the deletion of the role editor as long as possible This should prevent crashes that can be caused if the view is closed in a nested event loop that is run from the role editor. BUG: 322969 FIXED-IN: 4.11.1 REVIEW: 111988 --- src/kitemviews/kstandarditemlistwidget.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 2a89004c6..483517ecc 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -204,8 +204,13 @@ KStandardItemListWidget::~KStandardItemListWidget() qDeleteAll(m_textInfo); m_textInfo.clear(); - delete m_roleEditor; - delete m_oldRoleEditor; + if (m_roleEditor) { + m_roleEditor->deleteLater(); + } + + if (m_oldRoleEditor) { + m_oldRoleEditor->deleteLater(); + } } void KStandardItemListWidget::setLayout(Layout layout) @@ -649,16 +654,15 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const this, SLOT(slotRoleEditingCanceled(QByteArray,QVariant))); disconnect(m_roleEditor, SIGNAL(roleEditingFinished(QByteArray,QVariant)), this, SLOT(slotRoleEditingFinished(QByteArray,QVariant))); + + if (m_oldRoleEditor) { + m_oldRoleEditor->deleteLater(); + } m_oldRoleEditor = m_roleEditor; m_roleEditor->hide(); m_roleEditor = 0; } return; - } else if (m_oldRoleEditor) { - // Delete the old editor before constructing the new one to - // prevent a memory leak. - m_oldRoleEditor->deleteLater(); - m_oldRoleEditor = 0; } Q_ASSERT(!m_roleEditor); @@ -1302,6 +1306,9 @@ void KStandardItemListWidget::closeRoleEditor() scene()->views()[0]->parentWidget()->setFocus(); } + if (m_oldRoleEditor) { + m_oldRoleEditor->deleteLater(); + } m_oldRoleEditor = m_roleEditor; m_roleEditor->hide(); m_roleEditor = 0; -- 2.47.3