Core: Delay creation of settings page widgets

... until they are actually shown.

Change-Id: Ibf47fe57c69557f9c514cc5a7c7c8aff369b1324
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2023-04-19 16:20:33 +02:00
parent 1c37aab5bd
commit 43e3b41afd

View File

@@ -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);