From dd57d0b49d958a4bc568b0d38aca1ba250c214e6 Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Tue, 8 May 2018 09:23:55 +0200 Subject: [PATCH] Core: Fix crash after second showOptionsDialog call Do not destroy QEventLoop until it's exec() call is over. Instead only call exit() for all loops when the settings dialog is closed. Change-Id: I9598270ee5f4d294ffcad9b45dda4543e15d63f0 Reviewed-by: Eike Ziller --- .../coreplugin/dialogs/settingsdialog.cpp | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index e3914932ce8..1cc52d6331e 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -59,13 +59,6 @@ static const char pageKeyC[] = "General/LastPreferencePage"; const int categoryIconSize = 24; -namespace std { -template<> -struct default_delete { - void operator()(QEventLoop* p) { p->exit(); delete p; } // exit event loop -}; -} // namespace std - namespace Core { namespace Internal { @@ -433,7 +426,7 @@ private: Utils::FancyLineEdit *m_filterLineEdit; QListView *m_categoryList; QLabel *m_headerLabel; - std::vector> m_eventLoops; + std::vector m_eventLoops; bool m_running = false; bool m_applied = false; bool m_finished = false; @@ -731,8 +724,10 @@ void SettingsDialog::done(int val) ICore::saveSettings(); // save all settings - - m_eventLoops.erase(m_eventLoops.begin(), m_eventLoops.end()); // exit event loops in reverse order of addition + // exit event loops in reverse order of addition + for (QEventLoop *eventLoop : m_eventLoops) + eventLoop->exit(); + m_eventLoops.clear(); QDialog::done(val); } @@ -761,8 +756,10 @@ bool SettingsDialog::execDialog() // a break point it will complain about missing helper, and offer the // option to open the settings dialog. // Keep the UI running by creating another event loop. - m_eventLoops.emplace(m_eventLoops.begin(), std::make_unique()); - m_eventLoops.front()->exec(); + QEventLoop eventLoop; + m_eventLoops.emplace(m_eventLoops.begin(), &eventLoop); + eventLoop.exec(); + QTC_ASSERT(m_eventLoops.empty(), return m_applied;); } return m_applied; }