diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2022-02-25 16:43:45 +0800 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2022-05-25 19:51:20 +0800 |
commit | 7b535d22d67d696b6f3e134a9937fd035990ab86 (patch) | |
tree | 1ba18c78b871ee191532b230e77b6f88e49e61aa | |
parent | 615e9b33487736330ce50053bc7bb050296fca09 (diff) |
Give Dialogs and Menus focus by default
Dialogs and Menus should always have focus when they're opened,
especially now that the cancel key handling in
QQuickPopup/QQuickPopupItem is done via regular key events and not
shortcuts, as popups will now require focus in order to be cancelled
via keyboard.
[ChangeLog][Controls][Important Behavior Changes] Dialogs and Menus now
have their focus property set to true by default. Popups are unchanged,
meaning that popups that should be interacted with via keyboard
(including cancelling) should have focus set to true or
forceActiveFocus() called on them after opening.
Task-number: QTBUG-79280
Change-Id: Idd070f2b1e8180a34a0dadb6e11dc56e531df211
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
-rw-r--r-- | src/quicktemplates2/qquickdialog.cpp | 6 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenu.cpp | 2 | ||||
-rw-r--r-- | tests/auto/quickcontrols2/controls/data/tst_dialog.qml | 1 | ||||
-rw-r--r-- | tests/auto/quickcontrols2/qquickmenu/tst_qquickmenu.cpp | 4 |
4 files changed, 11 insertions, 2 deletions
diff --git a/src/quicktemplates2/qquickdialog.cpp b/src/quicktemplates2/qquickdialog.cpp index 0ec620ecd9..5023fe0a81 100644 --- a/src/quicktemplates2/qquickdialog.cpp +++ b/src/quicktemplates2/qquickdialog.cpp @@ -61,6 +61,8 @@ QT_BEGIN_NAMESPACE \image qtquickcontrols2-page-wireframe.png + By default, Dialogs have \l focus. + \section1 Dialog Title and Buttons Dialog's \l title is displayed by a style-specific title bar that is assigned @@ -203,6 +205,10 @@ QQuickDialog::QQuickDialog(QQuickDialogPrivate &dd, QObject *parent) : QQuickPopup(dd, parent) { Q_D(QQuickDialog); + + // Dialogs should get active focus when opened so that e.g. Cancel closes them. + setFocus(true); + QObject::connect(d->popupItem, &QQuickPopupItem::titleChanged, this, &QQuickDialog::titleChanged); QObject::connect(d->popupItem, &QQuickPopupItem::headerChanged, this, &QQuickDialog::headerChanged); QObject::connect(d->popupItem, &QQuickPopupItem::footerChanged, this, &QQuickDialog::footerChanged); diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index 6b4f3fafce..a4a7835e50 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -196,7 +196,7 @@ static const int SUBMENU_DELAY = 225; will be \c true. For more information, see \l {Keyboard Focus in Qt Quick}. - The default value is \c false. + The default value is \c true. \sa {Popup::}{activeFocus} */ diff --git a/tests/auto/quickcontrols2/controls/data/tst_dialog.qml b/tests/auto/quickcontrols2/controls/data/tst_dialog.qml index b227d82e1b..448fd49ca2 100644 --- a/tests/auto/quickcontrols2/controls/data/tst_dialog.qml +++ b/tests/auto/quickcontrols2/controls/data/tst_dialog.qml @@ -95,6 +95,7 @@ TestCase { verify(control.header) verify(control.footer) compare(control.standardButtons, 0) + verify(control.focus) } function test_accept() { diff --git a/tests/auto/quickcontrols2/qquickmenu/tst_qquickmenu.cpp b/tests/auto/quickcontrols2/qquickmenu/tst_qquickmenu.cpp index 9806eff7c3..77c665f977 100644 --- a/tests/auto/quickcontrols2/qquickmenu/tst_qquickmenu.cpp +++ b/tests/auto/quickcontrols2/qquickmenu/tst_qquickmenu.cpp @@ -117,6 +117,7 @@ void tst_QQuickMenu::defaults() QQuickMenu *emptyMenu = helper.appWindow->property("emptyMenu").value<QQuickMenu*>(); QCOMPARE(emptyMenu->isVisible(), false); + QVERIFY(emptyMenu->hasFocus()); QCOMPARE(emptyMenu->currentIndex(), -1); QCOMPARE(emptyMenu->contentItem()->property("currentIndex"), QVariant(-1)); QCOMPARE(emptyMenu->count(), 0); @@ -304,10 +305,11 @@ void tst_QQuickMenu::contextMenuKeyboard() QVERIFY(firstItem); QSignalSpy visibleSpy(menu, SIGNAL(visibleChanged())); - menu->setFocus(true); + QVERIFY(menu->hasFocus()); menu->open(); QCOMPARE(visibleSpy.count(), 1); QVERIFY(menu->isVisible()); + QVERIFY(menu->hasActiveFocus()); QQuickOverlay *overlay = window->property("overlay").value<QQuickOverlay*>(); QVERIFY(overlay); QVERIFY(overlay->childItems().contains(menu->contentItem()->parentItem())); |