diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-06-22 14:26:09 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-07-01 10:41:27 +0200 |
commit | d6bda220f799bd1a779c0e3d8b796b1fd23205c2 (patch) | |
tree | 3f575bd5a9f42555297eb0c7c22706d9abe1498f /tests | |
parent | 9115c841030be5a0d937b62a051d9b666b95131a (diff) |
Skip proxy widgets that can't take focus when (back)tabbing
Fixes regression introduced in b4981f9d4ca914c6ecaa49bfdd69e51806a3671a,
due to which it was possible to back-tab into a widget even though it or
its focusProxy had a NoFocus policy.
As a drive-by, split the complicated if-statement up a bit for improved
readability.
Change-Id: Ib0ac2604076e812e340b11534c23ae8ae958d082
Fixes: QTBUG-76924
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
(cherry picked from commit 0dbd2dd86389c0705dbe9f518aed12f609ed09a1)
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 9d2ed2e14e..7a39701f3e 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -67,6 +67,7 @@ #include <qproxystyle.h> #include <QtWidgets/QGraphicsView> #include <QtWidgets/QGraphicsProxyWidget> +#include <QtWidgets/QSpinBox> #include <QtGui/qwindow.h> #include <qtimer.h> @@ -180,6 +181,7 @@ private slots: void reverseTabOrder(); void tabOrderWithProxy(); void tabOrderWithCompoundWidgets(); + void tabOrderWithCompoundWidgetsNoFocusPolicy(); void tabOrderNoChange(); void tabOrderNoChange2(); #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) @@ -1964,6 +1966,51 @@ static void dumpFocusChain(QWidget *start, bool bForward, const char *desc = nul #endif } +void tst_QWidget::tabOrderWithCompoundWidgetsNoFocusPolicy() +{ + Container container; + container.setWindowTitle(QLatin1String(QTest::currentTestFunction())); + QSpinBox spinbox1; + spinbox1.setObjectName("spinbox1"); + QSpinBox spinbox2; + spinbox2.setObjectName("spinbox2"); + QSpinBox spinbox3; + spinbox3.setObjectName("spinbox3"); + + spinbox1.setFocusPolicy(Qt::StrongFocus); + spinbox2.setFocusPolicy(Qt::NoFocus); + spinbox3.setFocusPolicy(Qt::StrongFocus); + container.box->addWidget(&spinbox1); + container.box->addWidget(&spinbox2); + container.box->addWidget(&spinbox3); + + container.show(); + container.activateWindow(); + + QApplication::setActiveWindow(&container); + if (!QTest::qWaitForWindowActive(&container)) + QSKIP("Window failed to activate, skipping test"); + + QVERIFY2(spinbox1.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + container.tab(); + QVERIFY2(!spinbox2.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + QVERIFY2(spinbox3.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + container.tab(); + QVERIFY2(spinbox1.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + container.backTab(); + QVERIFY2(spinbox3.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + container.backTab(); + QVERIFY2(!spinbox2.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); + QVERIFY2(spinbox1.hasFocus(), + qPrintable(QApplication::focusWidget()->objectName())); +} + void tst_QWidget::tabOrderNoChange() { QWidget w; |