diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-07-11 08:25:07 +0200 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-08-21 08:25:51 +0000 |
commit | 2c0554c187adb4ef886affd193b8149afa199d13 (patch) | |
tree | 8c484fc209db1c06e5eec942d1af9e1d0b566140 /src/plugins/projectexplorer/toolchainoptionspage.cpp | |
parent | 263cf4c6088d579a2cda05b3d5b795840e3e79fc (diff) |
ProjectExplorer: Fix memory leaks in tree models
Fix widgets being leaked by the ToolChainOptionsPage.
This page created widgets and stored them in the tree node
and never deleted them.
The fix is to put all the widgets into one QStackedWidget, so
that this will clean up once the page is destroyed.
Change-Id: Ic02824a4c52771d8962dc594176077c2e139fb84
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/plugins/projectexplorer/toolchainoptionspage.cpp')
-rw-r--r-- | src/plugins/projectexplorer/toolchainoptionspage.cpp | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 562c7c6d62..eff7f3a408 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -48,6 +48,7 @@ #include <QMessageBox> #include <QPushButton> #include <QSpacerItem> +#include <QStackedWidget> #include <QTextStream> #include <QTreeView> #include <QVBoxLayout> @@ -60,11 +61,12 @@ namespace Internal { class ToolChainTreeItem : public TreeItem { public: - ToolChainTreeItem(ToolChain *tc, bool c) : + ToolChainTreeItem(QStackedWidget *parentWidget, ToolChain *tc, bool c) : toolChain(tc), changed(c) { - widget = tc->configurationWidget(); + widget = tc->createConfigurationWidget().release(); if (widget) { + parentWidget->addWidget(widget); if (tc->isAutoDetected()) widget->makeReadOnly(); QObject::connect(widget, &ToolChainConfigWidget::dirty, @@ -132,9 +134,6 @@ public: m_model.rootItem()->appendChild(autoRoot); m_model.rootItem()->appendChild(manualRoot); - foreach (ToolChain *tc, ToolChainManager::toolChains()) - insertToolChain(tc); - m_toolChainView = new QTreeView(this); m_toolChainView->setUniformRowHeights(true); m_toolChainView->setSelectionMode(QAbstractItemView::SingleSelection); @@ -174,6 +173,12 @@ public: m_container->setState(DetailsWidget::NoSummary); m_container->setVisible(false); + m_widgetStack = new QStackedWidget; + m_container->setWidget(m_widgetStack); + + foreach (ToolChain *tc, ToolChainManager::toolChains()) + insertToolChain(tc); + auto buttonLayout = new QVBoxLayout; buttonLayout->setSpacing(6); buttonLayout->setContentsMargins(0, 0, 0, 0); @@ -234,6 +239,7 @@ public: QList<ToolChainFactory *> m_factories; QTreeView *m_toolChainView; DetailsWidget *m_container; + QStackedWidget *m_widgetStack; QPushButton *m_addButton; QPushButton *m_cloneButton; QPushButton *m_delButton; @@ -260,8 +266,9 @@ void ToolChainOptionsWidget::markForRemoval(ToolChainTreeItem *item) ToolChainTreeItem *ToolChainOptionsWidget::insertToolChain(ToolChain *tc, bool changed) { StaticTreeItem *parent = parentForToolChain(tc); - auto item = new ToolChainTreeItem(tc, changed); + auto item = new ToolChainTreeItem(m_widgetStack, tc, changed); parent->appendChild(item); + return item; } @@ -308,13 +315,10 @@ StaticTreeItem *ToolChainOptionsWidget::parentForToolChain(ToolChain *tc) void ToolChainOptionsWidget::toolChainSelectionChanged() { ToolChainTreeItem *item = currentTreeItem(); - QWidget *oldWidget = m_container->takeWidget(); // Prevent deletion. - if (oldWidget) - oldWidget->setVisible(false); QWidget *currentTcWidget = item ? item->widget : nullptr; - m_container->setWidget(currentTcWidget); + m_widgetStack->setCurrentWidget(currentTcWidget); m_container->setVisible(currentTcWidget); updateState(); } |