From 43e3b41afda2682ed0725327d55bac5e683bcd06 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 19 Apr 2023 16:20:33 +0200 Subject: [PATCH] Core: Delay creation of settings page widgets ... until they are actually shown. Change-Id: Ibf47fe57c69557f9c514cc5a7c7c8aff369b1324 Reviewed-by: Eike Ziller --- .../coreplugin/dialogs/settingsdialog.cpp | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 017b8dc8846..f429994edd9 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -331,14 +331,26 @@ public: class SmartScrollArea : public QScrollArea { public: - explicit SmartScrollArea(QWidget *parent) - : QScrollArea(parent) + explicit SmartScrollArea(QWidget *parent, IOptionsPage *page) + : QScrollArea(parent), m_page(page) { setFrameStyle(QFrame::NoFrame | QFrame::Plain); viewport()->setAutoFillBackground(false); setWidgetResizable(true); } + private: + void showEvent(QShowEvent *event) final + { + if (!widget()) { + QWidget *inner = m_page->widget(); + setWidget(inner); + inner->setAutoFillBackground(false); + } + + QScrollArea::showEvent(event); + } + void resizeEvent(QResizeEvent *event) final { QWidget *inner = widget(); @@ -387,6 +399,8 @@ private: return 0; return list.first()->sizeHint().width(); } + + IOptionsPage *m_page = nullptr; }; // ----------- SettingsDialog @@ -604,14 +618,8 @@ void SettingsDialog::ensureCategoryWidget(Category *category) m_model.ensurePages(category); auto tabWidget = new QTabWidget; tabWidget->tabBar()->setObjectName("qc_settings_main_tabbar"); // easier lookup in Squish - for (IOptionsPage *page : std::as_const(category->pages)) { - QWidget *widget = page->widget(); - ICore::setupScreenShooter(page->displayName(), widget); - auto ssa = new SmartScrollArea(this); - ssa->setWidget(widget); - widget->setAutoFillBackground(false); - tabWidget->addTab(ssa, page->displayName()); - } + for (IOptionsPage *page : std::as_const(category->pages)) + tabWidget->addTab(new SmartScrollArea(this, page), page->displayName()); connect(tabWidget, &QTabWidget::currentChanged, this, &SettingsDialog::currentTabChanged);