diff options
| author | Tor Arne Vestbø <[email protected]> | 2025-05-22 17:27:55 +0200 |
|---|---|---|
| committer | Volker Hilsheimer <[email protected]> | 2025-07-17 16:07:57 +0000 |
| commit | bb0c8bbf20fc1cdddd7e171260c4435f360e23d5 (patch) | |
| tree | 8b0d2cc9a9e1c8fd9dd04efbcf5ef41f091cef34 | |
| parent | 70fa17fcb832f187bdaf0edad9cdcef32053e15f (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.cpp | 7 | ||||
| -rw-r--r-- | tests/auto/other/qaccessibility/tst_qaccessibility.cpp | 21 |
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() |
