summaryrefslogtreecommitdiffstats
path: root/tests/auto/qstackedwidget
diff options
context:
space:
mode:
authorJan Arve Saether <jan-arve.saether@digia.com>2013-02-19 14:02:24 (GMT)
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-20 10:01:49 (GMT)
commit5a58067a8ed92553182467a3522aff7747a22cad (patch)
tree59adea3fc9c6ba124d1fe2aaa7cf18ca09b96de8 /tests/auto/qstackedwidget
parent8e61e0063c3e90c5957d0a5c8e99cf163cb096c1 (diff)
downloadQt-5a58067a8ed92553182467a3522aff7747a22cad.zip
Qt-5a58067a8ed92553182467a3522aff7747a22cad.tar.gz
Qt-5a58067a8ed92553182467a3522aff7747a22cad.tar.bz2
QStackedLayout: Fix crash when focus widget is destroyed in hide()
We also have to make sure that when moving back to a page that has a focusWidget(), the focus should go to the focusWidget() Task-number: QTBUG-18242 Change-Id: Ibfa7d6361c1a456480b2f1584a88ef4c4f405709 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> (cherry picked from qtbase/18f9eb797bffe8626f1edeca3c88f80dae0da8d7)
Diffstat (limited to 'tests/auto/qstackedwidget')
-rw-r--r--tests/auto/qstackedwidget/tst_qstackedwidget.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/tests/auto/qstackedwidget/tst_qstackedwidget.cpp b/tests/auto/qstackedwidget/tst_qstackedwidget.cpp
index ba8171c..c3b6e23 100644
--- a/tests/auto/qstackedwidget/tst_qstackedwidget.cpp
+++ b/tests/auto/qstackedwidget/tst_qstackedwidget.cpp
@@ -47,6 +47,8 @@
#include <qstackedwidget.h>
#include <qpushbutton.h>
#include <QHBoxLayout>
+#include <qlineedit.h>
+#include "../../shared/util.h"
//TESTED_CLASS=
//TESTED_FILES=
@@ -62,6 +64,7 @@ public:
private slots:
void getSetCheck();
void testMinimumSize();
+ void dynamicPages();
};
tst_QStackedWidget::tst_QStackedWidget()
@@ -120,5 +123,91 @@ void tst_QStackedWidget::getSetCheck()
delete var2;
}
+// QTBUG-18242, a widget that deletes its children in hideEvent().
+// This caused a crash in QStackedLayout::setCurrentIndex() since
+// the focus widget was destroyed while hiding the previous page.
+class TestPage : public QWidget
+{
+public:
+ TestPage (bool staticWidgets = false) : QWidget(0), m_staticWidgets(staticWidgets)
+ {
+ new QVBoxLayout (this);
+ }
+
+ ~TestPage() {
+ destroyWidgets();
+ }
+
+ void setN(int n)
+ {
+ m_n = n;
+ if (m_staticWidgets)
+ createWidgets();
+ }
+
+ virtual void showEvent (QShowEvent *)
+ {
+ if (!m_staticWidgets)
+ createWidgets();
+ }
+
+ virtual void hideEvent (QHideEvent *)
+ {
+ if (!m_staticWidgets)
+ destroyWidgets();
+ }
+
+private:
+ void createWidgets() {
+ for (int i = 0; i < m_n; ++i) {
+ QLineEdit *le = new QLineEdit(this);
+ le->setObjectName(QString::fromLatin1("lineEdit%1").arg(i));
+ layout ()->addWidget(le);
+ m_les << le;
+ }
+ }
+
+ void destroyWidgets()
+ {
+ qDeleteAll(m_les);
+ m_les.clear ();
+ }
+
+ int m_n;
+ const bool m_staticWidgets;
+ QList<QLineEdit*> m_les;
+};
+
+void tst_QStackedWidget::dynamicPages()
+{
+ QStackedWidget *sw = new QStackedWidget;
+
+ TestPage *w1 = new TestPage(true);
+ w1->setN(3);
+
+ TestPage *w2 = new TestPage;
+ w2->setN(3);
+
+ sw->addWidget(w1);
+ sw->addWidget(w2);
+
+ QLineEdit *le11 = w1->findChild<QLineEdit*>(QLatin1String("lineEdit1"));
+ le11->setFocus(); // set focus to second widget in the page
+ sw->resize(200, 200);
+ sw->show();
+ qApp->setActiveWindow(sw);
+ QTest::qWaitForWindowShown(sw);
+ QTRY_COMPARE(QApplication::focusWidget(), le11);
+
+ sw->setCurrentIndex(1);
+ QLineEdit *le22 = w2->findChild<QLineEdit*>(QLatin1String("lineEdit2"));
+ le22->setFocus();
+ QTRY_COMPARE(QApplication::focusWidget(), le22);
+ // Going back should move focus back to le11
+ sw->setCurrentIndex(0);
+ QTRY_COMPARE(QApplication::focusWidget(), le11);
+
+}
+
QTEST_MAIN(tst_QStackedWidget)
#include "tst_qstackedwidget.moc"