From e17dddfd3bcc09a9ae919a1650107c8cd3a75d08 Mon Sep 17 00:00:00 2001 From: Jan Arve Saether Date: Thu, 20 Dec 2012 16:09:39 +0100 Subject: Make hierarchy of actions in menubars more consistent. There is an assumption that the interface returned from iface->parent() would have iface as one of its children (thus, parent->indexOfChild(iface) should always return an integer != -1, indicating that it is a child. This is a good assumption, otherwise an hierarchy would be presented differently depending on how it is traversed. However, a QMenu created like this: QMenu *menu = new QMenu("weird parent", mainWindow); mainWindow->menuBar()->addMenu(menu); will have a different ancestor sequence than a menu created like this: mainWindow->menuBar()->addMenu("ok parent"); This is because it will walk up the QObject hierarchy. This patch tries to deal with that by looking at which widgets the action of the menu is associated with before determining which should be the accessible parent. Change-Id: I00dad8a94463f772d7b1f5d66fdb36b2e8d3aea2 Reviewed-by: Frederik Gladhorn --- src/plugins/accessible/widgets/qaccessiblemenu.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/plugins/accessible/widgets/qaccessiblemenu.cpp') diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp index fd2619f545..e467ef50bd 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(parent) || qobject_cast(parent)) { - return new QAccessibleMenuItem(parent, menu()->menuAction()); + if (QAction *menuAction = menu()->menuAction()) { + QList parentCandidates; + parentCandidates << menu()->parentWidget(); + parentCandidates << menuAction->associatedWidgets(); + foreach (QWidget *w, parentCandidates) { + if (qobject_cast(w) || qobject_cast(w)) { + if (w->actions().indexOf(menuAction) != -1) + return new QAccessibleMenuItem(w, menuAction); + } + } } return QAccessibleWidget::parent(); } -- cgit v1.2.3