diff options
Diffstat (limited to 'src/plugins/accessible/widgets/qaccessiblemenu.cpp')
-rw-r--r-- | src/plugins/accessible/widgets/qaccessiblemenu.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp index e467ef50bd..f248e6d05e 100644 --- a/src/plugins/accessible/widgets/qaccessiblemenu.cpp +++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp @@ -55,6 +55,16 @@ QT_BEGIN_NAMESPACE QString Q_GUI_EXPORT qt_accStripAmp(const QString &text); QString Q_GUI_EXPORT qt_accHotKey(const QString &text); +QAccessibleInterface *getOrCreateMenu(QWidget *menu, QAction *action) +{ + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(action); + if (!iface) { + iface = new QAccessibleMenuItem(menu, action); + QAccessible::registerAccessibleInterface(iface); + } + return iface; +} + QAccessibleMenu::QAccessibleMenu(QWidget *w) : QAccessibleWidget(w) { @@ -76,7 +86,7 @@ QAccessibleInterface *QAccessibleMenu::childAt(int x, int y) const QAction *act = menu()->actionAt(menu()->mapFromGlobal(QPoint(x,y))); if(act && act->isSeparator()) act = 0; - return act ? new QAccessibleMenuItem(menu(), act) : 0; + return act ? getOrCreateMenu(menu(), act) : 0; } QString QAccessibleMenu::text(QAccessible::Text t) const @@ -98,7 +108,7 @@ QAccessible::Role QAccessibleMenu::role() const QAccessibleInterface *QAccessibleMenu::child(int index) const { if (index < childCount()) - return new QAccessibleMenuItem(menu(), menu()->actions().at(index)); + return getOrCreateMenu(menu(), menu()->actions().at(index)); return 0; } @@ -111,7 +121,7 @@ QAccessibleInterface *QAccessibleMenu::parent() const 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 getOrCreateMenu(w, menuAction); } } } @@ -146,8 +156,9 @@ int QAccessibleMenuBar::childCount() const QAccessibleInterface *QAccessibleMenuBar::child(int index) const { - if (index < childCount()) - return new QAccessibleMenuItem(menuBar(), menuBar()->actions().at(index)); + if (index < childCount()) { + return getOrCreateMenu(menuBar(), menuBar()->actions().at(index)); + } return 0; } @@ -177,7 +188,6 @@ QAccessibleInterface *QAccessibleMenuItem::childAt(int x, int y ) const if (childInterface->rect().contains(x,y)) { return childInterface; } - delete childInterface; } return 0; } @@ -207,7 +217,7 @@ QAccessibleInterface *QAccessibleMenuItem::parent() const QAccessibleInterface *QAccessibleMenuItem::child(int index) const { if (index == 0 && action()->menu()) - return new QAccessibleMenu(action()->menu()); + return QAccessible::queryAccessibleInterface(action()->menu()); return 0; } |