path: root/src/plugins/accessible
diff options
authorJan Arve Saether <>2012-12-20 16:09:39 +0100
committerThe Qt Project <>2013-01-21 18:57:27 +0100
commite17dddfd3bcc09a9ae919a1650107c8cd3a75d08 (patch)
treedd391661cc521f3022338ca3478b82a96a301d3a /src/plugins/accessible
parentfb4aef9c70ac29bde97b39b7737171c1879899ed (diff)
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 <>
Diffstat (limited to 'src/plugins/accessible')
1 files changed, 10 insertions, 3 deletions
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<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();