diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2022-02-21 16:02:58 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-03-02 17:14:44 +0000 |
commit | 750817d52b4104817c8a695846a875d37c01452c (patch) | |
tree | 6dd0fc97457f564bd3f9a434cea74e2d689426e6 | |
parent | 699a6d046d54d7e46c5163c628125fff4acec4c2 (diff) |
A11Y: make QQuickText focusable for A11Y
A QtQuick Text element is used to represent a separate block of text
in a window.
Normally, when TalkBack is enabled, the user expects to be able to
navigate between separate blocks of text with regular A11Y gestures.
However before this patch the Text elements were not focusable by
default, so all the Text elements in the Window were read by the
TalkBack successively, as if it was one element.
This could be solved by explicitly adding
Accessible.focusable: true
to the properties of every Text element.
This patch enables A11Y focus on Text elements by default.
Fixes: QTBUG-77371
Change-Id: Icfcef6ee301b9218bb9ace97a05432c9fc2ffb0a
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit 9c5f772b5eb008cd0d00a0801b80a399fdc0e3c9)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/quick/accessible/qaccessiblequickitem.cpp | 7 | ||||
-rw-r--r-- | src/quick/items/qquickaccessibleattached.cpp | 5 | ||||
-rw-r--r-- | tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp | 1 |
3 files changed, 10 insertions, 3 deletions
diff --git a/src/quick/accessible/qaccessiblequickitem.cpp b/src/quick/accessible/qaccessiblequickitem.cpp index 933a5b5cbe..9a4ce960f1 100644 --- a/src/quick/accessible/qaccessiblequickitem.cpp +++ b/src/quick/accessible/qaccessiblequickitem.cpp @@ -448,6 +448,11 @@ QList<QQuickItem *> QAccessibleQuickItem::childItems() const return accessibleUnignoredChildren(item()); } +static bool isTextRole(QAccessible::Role role) +{ + return role == QAccessible::EditableText || role == QAccessible::StaticText; +} + QAccessible::State QAccessibleQuickItem::state() const { QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(item()); @@ -465,7 +470,7 @@ QAccessible::State QAccessibleQuickItem::state() const state.offscreen = true; if ((role() == QAccessible::CheckBox || role() == QAccessible::RadioButton) && object()->property("checked").toBool()) state.checked = true; - if (item()->activeFocusOnTab() || role() == QAccessible::EditableText) + if (item()->activeFocusOnTab() || isTextRole(role())) state.focusable = true; if (item()->hasActiveFocus()) state.focused = true; diff --git a/src/quick/items/qquickaccessibleattached.cpp b/src/quick/items/qquickaccessibleattached.cpp index 0b593c0089..730bbe4404 100644 --- a/src/quick/items/qquickaccessibleattached.cpp +++ b/src/quick/items/qquickaccessibleattached.cpp @@ -406,9 +406,10 @@ void QQuickAccessibleAttached::setRole(QAccessible::Role role) m_state.focusable = true; break; case QAccessible::StaticText: - if (!m_stateExplicitlySet.readOnly) { + if (!m_stateExplicitlySet.readOnly) m_state.readOnly = true; - } + if (!m_stateExplicitlySet.focusable) + m_state.focusable = true; break; default: break; diff --git a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp index 1383d89ed2..d48c7ed163 100644 --- a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp +++ b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp @@ -387,6 +387,7 @@ void tst_QQuickAccessible::basicPropertiesTest() QCOMPARE(item->indexOfChild(text2), 1); QVERIFY(!text2->state().editable); QVERIFY(text2->state().readOnly); + QVERIFY(text2->state().focusable); QCOMPARE(iface->indexOfChild(text2), -1); QCOMPARE(text2->indexOfChild(item), -1); |