diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2017-04-24 12:07:46 +0200 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2017-04-24 13:37:02 +0000 |
commit | 039c25daac5ec6b96c0aa074eae2a983a1b5aabd (patch) | |
tree | e8fb889ce6bedae2664a37a9c0d138f9bddd2401 | |
parent | 743d0132fe006699dd33e5b4254a36f4e2ec7f9f (diff) |
Forward focus to the contentItem of editable spinboxes
This fixes the scenario where a SpinBox is shown for the first time
with focus, but its editor (TextInput) doesn't have active focus.
tst_focus' keyNavigation.qml had to be adjusted, as an editable
spinbox will now consume key events.
Task-number: QTBUG-60356
Change-Id: I3af0260a22e9633ab6110d6adab7b39a22b849de
Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
-rw-r--r-- | src/quicktemplates2/qquickspinbox.cpp | 10 | ||||
-rw-r--r-- | src/quicktemplates2/qquickspinbox_p.h | 1 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_spinbox.qml | 11 | ||||
-rw-r--r-- | tests/auto/focus/data/keyNavigation.qml | 1 |
4 files changed, 22 insertions, 1 deletions
diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index b6e99609..a41383aa 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -719,6 +719,16 @@ void QQuickSpinBox::decrease() setValue(d->value - d->effectiveStepSize()); } +void QQuickSpinBox::focusInEvent(QFocusEvent *event) +{ + Q_D(QQuickSpinBox); + QQuickControl::focusInEvent(event); + + // When an editable SpinBox gets focus, it must pass on the focus to its editor. + if (d->editable && d->contentItem && !d->contentItem->hasActiveFocus()) + d->contentItem->forceActiveFocus(event->reason()); +} + void QQuickSpinBox::hoverEnterEvent(QHoverEvent *event) { Q_D(QQuickSpinBox); diff --git a/src/quicktemplates2/qquickspinbox_p.h b/src/quicktemplates2/qquickspinbox_p.h index d51a2ccb..73cb3389 100644 --- a/src/quicktemplates2/qquickspinbox_p.h +++ b/src/quicktemplates2/qquickspinbox_p.h @@ -127,6 +127,7 @@ Q_SIGNALS: Q_REVISION(2) void inputMethodComposingChanged(); protected: + void focusInEvent(QFocusEvent *event) override; void hoverEnterEvent(QHoverEvent *event) override; void hoverMoveEvent(QHoverEvent *event) override; void hoverLeaveEvent(QHoverEvent *event) override; diff --git a/tests/auto/controls/data/tst_spinbox.qml b/tests/auto/controls/data/tst_spinbox.qml index 6d681d60..4b2e38b3 100644 --- a/tests/auto/controls/data/tst_spinbox.qml +++ b/tests/auto/controls/data/tst_spinbox.qml @@ -51,6 +51,7 @@ import QtQuick 2.2 import QtTest 1.0 import QtQuick.Controls 2.2 +import QtQuick.Window 2.3 TestCase { id: testCase @@ -422,6 +423,16 @@ TestCase { compare(control.value, 100) } + function test_initialFocus() { + var window = testCase.Window.window + verify(window) + compare(window.activeFocusItem, window.contentItem) + + var control = createTemporaryObject(spinBox, testCase, { editable: true, focus: true }) + verify(control) + tryCompare(control.contentItem, "activeFocus", true) + } + function test_editable() { var control = createTemporaryObject(spinBox, testCase) verify(control) diff --git a/tests/auto/focus/data/keyNavigation.qml b/tests/auto/focus/data/keyNavigation.qml index 98a58ab5..ba7d5807 100644 --- a/tests/auto/focus/data/keyNavigation.qml +++ b/tests/auto/focus/data/keyNavigation.qml @@ -191,7 +191,6 @@ Item { SpinBox { id: spinbox objectName: "spinbox" - editable: true value: 50 KeyNavigation.left: radiobutton2 KeyNavigation.right: swtich |