summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.cpp13
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp11
2 files changed, 19 insertions, 5 deletions
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
index fd2619f5458..e467ef50bdd 100644
--- a/src/plugins/accessible/widgets/qaccessiblemenu.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
@@ -104,9 +104,16 @@ QAccessibleInterface *QAccessibleMenu::child(int index) const
QAccessibleInterface *QAccessibleMenu::parent() const
{
- QWidget *parent = menu()->parentWidget();
- if (qobject_cast<QMenu*>(parent) || qobject_cast<QMenuBar*>(parent)) {
- return new QAccessibleMenuItem(parent, menu()->menuAction());
+ if (QAction *menuAction = menu()->menuAction()) {
+ QList<QWidget *> parentCandidates;
+ parentCandidates << menu()->parentWidget();
+ parentCandidates << menuAction->associatedWidgets();
+ foreach (QWidget *w, parentCandidates) {
+ if (qobject_cast<QMenu*>(w) || qobject_cast<QMenuBar*>(w)) {
+ if (w->actions().indexOf(menuAction) != -1)
+ return new QAccessibleMenuItem(w, menuAction);
+ }
+ }
}
return QAccessibleWidget::parent();
}
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index ea322b20a10..68fde2fd2ed 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -1265,14 +1265,21 @@ void tst_QAccessibility::menuTest()
mw.menuBar()->addAction("Action!");
+ QMenu *childOfMainWindow = new QMenu(QStringLiteral("&Tools"), &mw);
+ childOfMainWindow->addAction("&Options");
+ mw.menuBar()->addMenu(childOfMainWindow);
+
mw.show(); // triggers layout
QTest::qWait(100);
- QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(mw.menuBar());
+ QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(&mw);
QCOMPARE(verifyHierarchy(interface), 0);
+ delete interface;
+
+ interface = QAccessible::queryAccessibleInterface(mw.menuBar());
QVERIFY(interface);
- QCOMPARE(interface->childCount(), 5);
+ QCOMPARE(interface->childCount(), 6);
QCOMPARE(interface->role(), QAccessible::MenuBar);
QAccessibleInterface *iFile = interface->child(0);