summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Weghorn <[email protected]>2025-07-02 11:47:45 +0200
committerQt Cherry-pick Bot <[email protected]>2025-07-02 17:43:58 +0000
commit35ae325fd2e7169407a405784a2d40a0fc43a627 (patch)
tree9b8be59fd814270ba2f99a03de52a21546e31a72
parent770cc704c689805bdf5b6676dee28e151920243e (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.cpp25
-rw-r--r--src/widgets/accessible/simplewidgets_p.h4
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)