From 2ebca8cde1b71aeb63c6151a12844df5b4cd5fe4 Mon Sep 17 00:00:00 2001 From: Dheerendra Purohit Date: Thu, 17 Oct 2024 12:21:04 +0530 Subject: [PATCH] Add widgetAdded signal for QStackedWidget and QStackedLayout Currently, there is no signal provided when a widget is added or inserted into QStackedWidget or QStackedLayout. Emit a signal whenever a widget is added or inserted into QStackedWidget or QStackedLayout. [ChangeLog][QtWidgets][QStackedWidget] The widgetAdded() signal emits whenever a widget is added or inserted into QStackedWidget or QStackedLayout. Fixes: QTBUG-122748 Change-Id: I3bf658346a5881665214a8d8f77975aa10e497c0 Reviewed-by: Volker Hilsheimer --- src/widgets/kernel/qstackedlayout.cpp | 12 ++++++++++ src/widgets/kernel/qstackedlayout.h | 1 + src/widgets/widgets/qstackedwidget.cpp | 14 ++++++++++++ src/widgets/widgets/qstackedwidget.h | 1 + .../qstackedlayout/tst_qstackedlayout.cpp | 22 +++++++++++++++++++ .../qstackedwidget/tst_qstackedwidget.cpp | 21 ++++++++++++++++++ 6 files changed, 71 insertions(+) diff --git a/src/widgets/kernel/qstackedlayout.cpp b/src/widgets/kernel/qstackedlayout.cpp index 04eacf1d414..979bc21067c 100644 --- a/src/widgets/kernel/qstackedlayout.cpp +++ b/src/widgets/kernel/qstackedlayout.cpp @@ -113,6 +113,17 @@ QLayoutItem* QStackedLayoutPrivate::replaceAt(int idx, QLayoutItem *newitem) \sa removeWidget() */ +/*! + \fn void QStackedLayout::widgetAdded(int index) + + \since 6.9 + + This signal is emitted whenever a widget is added or inserted. + The widget's \a index is passed as parameter. + + \sa addWidget(), insertWidget() +*/ + /*! Constructs a QStackedLayout with no parent. @@ -204,6 +215,7 @@ int QStackedLayout::insertWidget(int index, QWidget *widget) widget->hide(); widget->lower(); } + emit widgetAdded(index); return index; } diff --git a/src/widgets/kernel/qstackedlayout.h b/src/widgets/kernel/qstackedlayout.h index 91d7d1e9f57..5b5a8f283fa 100644 --- a/src/widgets/kernel/qstackedlayout.h +++ b/src/widgets/kernel/qstackedlayout.h @@ -57,6 +57,7 @@ public: Q_SIGNALS: void widgetRemoved(int index); void currentChanged(int index); + void widgetAdded(int index); public Q_SLOTS: void setCurrentIndex(int index); diff --git a/src/widgets/widgets/qstackedwidget.cpp b/src/widgets/widgets/qstackedwidget.cpp index 9cecee2ef86..bd1eae4a19e 100644 --- a/src/widgets/widgets/qstackedwidget.cpp +++ b/src/widgets/widgets/qstackedwidget.cpp @@ -88,6 +88,18 @@ public: \sa removeWidget() */ +/*! + \fn void QStackedWidget::widgetAdded(int index) + + \since 6.9 + + This signal is emitted whenever a widget is added or inserted. + The widget's \a index is passed as parameter. + + \sa addWidget(), insertWidget() +*/ + + /*! Constructs a QStackedWidget with the given \a parent. @@ -102,6 +114,8 @@ QStackedWidget::QStackedWidget(QWidget *parent) this, &QStackedWidget::widgetRemoved); connect(d->layout, &QStackedLayout::currentChanged, this, &QStackedWidget::currentChanged); + connect(d->layout, &QStackedLayout::widgetAdded, + this, &QStackedWidget::widgetAdded); } /*! diff --git a/src/widgets/widgets/qstackedwidget.h b/src/widgets/widgets/qstackedwidget.h index 49f2794ff4f..0c4e8ece80e 100644 --- a/src/widgets/widgets/qstackedwidget.h +++ b/src/widgets/widgets/qstackedwidget.h @@ -41,6 +41,7 @@ public Q_SLOTS: Q_SIGNALS: void currentChanged(int); void widgetRemoved(int index); + void widgetAdded(int index); protected: bool event(QEvent *e) override; diff --git a/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp b/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp index c73b9725b2b..6e5e808ffd0 100644 --- a/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp +++ b/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp @@ -31,6 +31,7 @@ private slots: void keepFocusAfterSetCurrent(); void heigthForWidth(); void replaceWidget(); + void widgetAdded(); private: QWidget *testWidget; @@ -353,6 +354,27 @@ void tst_QStackedLayout::replaceWidget() QCOMPARE(stackLayout->currentWidget(), replaceTo); } + +void tst_QStackedLayout::widgetAdded() +{ + QStackedLayout stackedLayout; + QSignalSpy addSpy(&stackedLayout, &QStackedLayout::widgetAdded); + QVERIFY(addSpy.isValid()); + + stackedLayout.addWidget(new QWidget); + QCOMPARE(addSpy.count(), 1); + QCOMPARE(addSpy.at(0).at(0).toInt(), 0); + + stackedLayout.insertWidget(1, new QWidget); + QCOMPARE(addSpy.count(), 2); + QCOMPARE(addSpy.at(1).at(0).toInt(), 1); + + stackedLayout.insertWidget(100, new QWidget); + QCOMPARE(addSpy.count(), 3); + QCOMPARE(addSpy.at(2).at(0).toInt(), 2); +} + + QTEST_MAIN(tst_QStackedLayout) #include "tst_qstackedlayout.moc" diff --git a/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp b/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp index 3c28ad324af..c61a464281b 100644 --- a/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp +++ b/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -25,6 +26,7 @@ private slots: void getSetCheck(); void testMinimumSize(); void dynamicPages(); + void widgetAdded(); }; tst_QStackedWidget::tst_QStackedWidget() @@ -172,5 +174,24 @@ void tst_QStackedWidget::dynamicPages() } +void tst_QStackedWidget::widgetAdded() +{ + QStackedWidget stackedWidget; + QSignalSpy addSpy(&stackedWidget, &QStackedWidget::widgetAdded); + QVERIFY(addSpy.isValid()); + + stackedWidget.addWidget(new QWidget); + QCOMPARE(addSpy.count(), 1); + QCOMPARE(addSpy.at(0).at(0).toInt(), 0); + + stackedWidget.insertWidget(1, new QWidget); + QCOMPARE(addSpy.count(), 2); + QCOMPARE(addSpy.at(1).at(0).toInt(), 1); + + stackedWidget.insertWidget(100, new QWidget); + QCOMPARE(addSpy.count(), 3); + QCOMPARE(addSpy.at(2).at(0).toInt(), 2); +} + QTEST_MAIN(tst_QStackedWidget) #include "tst_qstackedwidget.moc"