diff options
author | Jan Arve Saether <jan-arve.saether@digia.com> | 2013-02-19 14:02:24 (GMT) |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-02-20 10:01:49 (GMT) |
commit | 5a58067a8ed92553182467a3522aff7747a22cad (patch) | |
tree | 59adea3fc9c6ba124d1fe2aaa7cf18ca09b96de8 /tests/auto/qstackedwidget | |
parent | 8e61e0063c3e90c5957d0a5c8e99cf163cb096c1 (diff) | |
download | Qt-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.cpp | 89 |
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" |