summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <[email protected]>2025-05-22 17:27:55 +0200
committerVolker Hilsheimer <[email protected]>2025-07-17 16:07:57 +0000
commitbb0c8bbf20fc1cdddd7e171260c4435f360e23d5 (patch)
tree8b0d2cc9a9e1c8fd9dd04efbcf5ef41f091cef34
parent70fa17fcb832f187bdaf0edad9cdcef32053e15f (diff)
Include showMenuAction() if context menu policy is Qt::ActionsContextMenu
We only report the action if we have any actions to present. For the other context menu policies we don't know if the user has overridden contextMenuEvent or connected to customContextMenuRequested, so we opt to not report the menu action in these cases. A user that wants to present the menu action will have to subclass QAccessibleWidget, override actionNames(), and install an accessible interface factory that returns the specialized QAccessibleWidget. As of now we do not report QAccessible::ActionChanged anywhere in Qt when the conditions for actionNames() change, and this includes this newly added behavior. Initial attempts at plumbing ActionChanged to the macOS a11y system failed as there is seemingly no way to trigger an update of this specific state, so this rabbit-hole has been left for further investigations. Pick-to: 6.10 6.9 6.8 Task-number: QTBUG-137126 Change-Id: I538df87603fbcae9ed2d9bcbb16f1de85a08f200 Reviewed-by: Volker Hilsheimer <[email protected]>
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp7
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp21
2 files changed, 28 insertions, 0 deletions
diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp
index 5421dc511bb..3d18117dd78 100644
--- a/src/widgets/accessible/qaccessiblewidget.cpp
+++ b/src/widgets/accessible/qaccessiblewidget.cpp
@@ -374,6 +374,8 @@ QStringList QAccessibleWidget::actionNames() const
if (widget()->isEnabled()) {
if (widget()->focusPolicy() != Qt::NoFocus)
names << setFocusAction();
+ if (widget()->contextMenuPolicy() == Qt::ActionsContextMenu && widget()->actions().size() > 0)
+ names << showMenuAction();
}
return names;
}
@@ -388,6 +390,11 @@ void QAccessibleWidget::doAction(const QString &actionName)
if (widget()->isWindow())
widget()->activateWindow();
widget()->setFocus();
+ } else if (actionName == showMenuAction()) {
+ QContextMenuEvent e(QContextMenuEvent::Other,
+ QPoint(), widget()->mapToGlobal(QPoint()),
+ QGuiApplication::keyboardModifiers());
+ QCoreApplication::sendEvent(widget(), &e);
}
}
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index 7926c7a73aa..95bcc9b20e2 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -929,6 +929,27 @@ void tst_QAccessibility::actionTest()
QCOMPARE(click_count, 1);
}
QTestAccessibility::clearEvents();
+
+ {
+ QCOMPARE(QAccessibleActionInterface::showMenuAction(), QString(QStringLiteral("ShowMenu")));
+
+ auto widgetHolder = std::make_unique<QWidget>();
+ auto widget = widgetHolder.get();
+ widget->addAction(new QAction("Foo"));
+ widget->addAction(new QAction("Bar"));
+ widget->show();
+
+ QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(widget);
+ QVERIFY(interface);
+ QVERIFY(interface->isValid());
+ QAccessibleActionInterface *actions = interface->actionInterface();
+ QVERIFY(actions);
+
+ QCOMPARE(actions->actionNames(), QStringList());
+ widget->setContextMenuPolicy(Qt::ActionsContextMenu);
+ QCOMPARE(actions->actionNames(), QStringList(QAccessibleActionInterface::showMenuAction()));
+ }
+ QTestAccessibility::clearEvents();
}
void tst_QAccessibility::applicationTest()