diff options
author | Michael Weghorn <[email protected]> | 2025-07-02 11:47:45 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <[email protected]> | 2025-07-02 17:43:58 +0000 |
commit | 35ae325fd2e7169407a405784a2d40a0fc43a627 (patch) | |
tree | 9b8be59fd814270ba2f99a03de52a21546e31a72 | |
parent | 770cc704c689805bdf5b6676dee28e151920243e (diff) |
QToolButton a11y: Take menu from default action into account
If a menu is set, QAccessibleToolButton takes it into account
for its role, for the QAccessible::State::hasPopup state
and for reporting it as an accessible child.
So far, this was only working when the menu was
directly set using QToolButton::setMenu, but not
when the menu came from the default action set
via QToolButton::setDefaultAction.
From a user perspective, that doesn't make a
difference, so also treat these equally on
the a11y layer, by taking into account the
default action's menu as well.
Fixes: QTBUG-138172
Pick-to: 6.9
Change-Id: Ida6915e983f026db7d9840542e4b5f5c14ae13e1
Reviewed-by: Volker Hilsheimer <[email protected]>
(cherry picked from commit 12cd5ef9e8a91aa281fbdd12ef4dbd85033e2659)
Reviewed-by: Qt Cherry-pick Bot <[email protected]>
-rw-r--r-- | src/widgets/accessible/simplewidgets.cpp | 25 | ||||
-rw-r--r-- | src/widgets/accessible/simplewidgets_p.h | 4 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp index 65488e6f0df..190c7b624f6 100644 --- a/src/widgets/accessible/simplewidgets.cpp +++ b/src/widgets/accessible/simplewidgets.cpp @@ -289,19 +289,32 @@ QToolButton *QAccessibleToolButton::toolButton() const bool QAccessibleToolButton::isSplitButton() const { #if QT_CONFIG(menu) - return toolButton()->menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup; + return menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup; #else return false; #endif } +#if QT_CONFIG(menu) +QMenu *QAccessibleToolButton::menu() const +{ + if (QMenu *menu = toolButton()->menu()) + return menu; + + if (QAction *defaultAction = toolButton()->defaultAction()) + return defaultAction->menu(); + + return nullptr; +} +#endif + QAccessible::State QAccessibleToolButton::state() const { QAccessible::State st = QAccessibleButton::state(); if (toolButton()->autoRaise()) st.hotTracked = true; #if QT_CONFIG(menu) - if (toolButton()->menu()) + if (menu()) st.hasPopup = true; #endif return st; @@ -316,7 +329,7 @@ QAccessible::Role QAccessibleToolButton::role() const { #if QT_CONFIG(menu) QToolButton *tb = toolButton(); - if (!tb->menu()) + if (!menu()) return tb->isCheckable() ? QAccessible::CheckBox : QAccessible::PushButton; else if (tb->popupMode() == QToolButton::DelayedPopup) return QAccessible::ButtonDropDown; @@ -328,10 +341,8 @@ QAccessible::Role QAccessibleToolButton::role() const QAccessibleInterface *QAccessibleToolButton::child(int index) const { #if QT_CONFIG(menu) - if (index == 0 && toolButton()->menu()) - { - return QAccessible::queryAccessibleInterface(toolButton()->menu()); - } + if (index == 0 && menu()) + return QAccessible::queryAccessibleInterface(menu()); #else Q_UNUSED(index); #endif diff --git a/src/widgets/accessible/simplewidgets_p.h b/src/widgets/accessible/simplewidgets_p.h index 02c23f8cba7..356ef9101b2 100644 --- a/src/widgets/accessible/simplewidgets_p.h +++ b/src/widgets/accessible/simplewidgets_p.h @@ -27,6 +27,7 @@ class QAbstractButton; class QLineEdit; class QToolButton; class QGroupBox; +class QMenu; class QMessageBox; class QProgressBar; @@ -71,6 +72,9 @@ protected: QToolButton *toolButton() const; bool isSplitButton() const; +#if QT_CONFIG(menu) + QMenu *menu() const; +#endif }; #endif // QT_CONFIG(toolbutton) |