13#include <private/qwidget_p.h>
15#if QT_CONFIG(accessibility)
26 QAccessibleInterface *
iface = QAccessible::queryAccessibleInterface(action);
28 iface =
new QAccessibleMenuItem(
menu, action);
29 QAccessible::registerAccessibleInterface(iface);
34QAccessibleMenu::QAccessibleMenu(
QWidget *
w)
40QMenu *QAccessibleMenu::menu()
const
42 return qobject_cast<QMenu*>(
object());
45int QAccessibleMenu::childCount()
const
50QAccessibleInterface *QAccessibleMenu::childAt(
int x,
int y)
const
55 return act ? getOrCreateMenu(
menu(), act) :
nullptr;
58QString QAccessibleMenu::text(QAccessible::Text
t)
const
60 QString tx = QAccessibleWidget::text(
t);
64 if (
t == QAccessible::Name)
69QAccessible::Role QAccessibleMenu::role()
const
71 return QAccessible::PopupMenu;
74QAccessibleInterface *QAccessibleMenu::child(
int index)
const
76 if (
index < childCount())
81QAccessibleInterface *QAccessibleMenu::parent()
const
86 parentCandidates.
reserve(associatedObjects.
size() + 1);
88 for (
QObject *
object :
std::as_const(parentCandidates)) {
89 if (qobject_cast<QMenu*>(
object)
91 || qobject_cast<QMenuBar*>(
object)
96 return getOrCreateMenu(
widget, menuAction);
100 return QAccessibleWidget::parent();
103int QAccessibleMenu::indexOfChild(
const QAccessibleInterface *
child)
const
105 QAccessible::Role
r =
child->role();
106 if ((
r == QAccessible::MenuItem ||
r == QAccessible::Separator) &&
menu()) {
112#if QT_CONFIG(menubar)
113QAccessibleMenuBar::QAccessibleMenuBar(
QWidget *
w)
119QMenuBar *QAccessibleMenuBar::menuBar()
const
121 return qobject_cast<QMenuBar*>(
object());
124int QAccessibleMenuBar::childCount()
const
129QAccessibleInterface *QAccessibleMenuBar::child(
int index)
const
131 if (
index < childCount()) {
137int QAccessibleMenuBar::indexOfChild(
const QAccessibleInterface *
child)
const
139 QAccessible::Role
r =
child->role();
140 if ((
r == QAccessible::MenuItem ||
r == QAccessible::Separator) &&
menuBar()) {
148QAccessibleMenuItem::QAccessibleMenuItem(
QWidget *owner,
QAction *action)
149: m_action(action), m_owner(owner)
153QAccessibleMenuItem::~QAccessibleMenuItem()
156QAccessibleInterface *QAccessibleMenuItem::childAt(
int x,
int y )
const
158 for (
int i = childCount() - 1;
i >= 0; --
i) {
159 QAccessibleInterface *childInterface =
child(
i);
160 if (childInterface->rect().contains(
x,
y)) {
161 return childInterface;
167int QAccessibleMenuItem::childCount()
const
169 return m_action->menu() ? 1 : 0;
172int QAccessibleMenuItem::indexOfChild(
const QAccessibleInterface *
child)
const
174 if (
child &&
child->role() == QAccessible::PopupMenu &&
child->object() == m_action->menu())
179bool QAccessibleMenuItem::isValid()
const
181 return m_action && m_owner;
184QAccessibleInterface *QAccessibleMenuItem::parent()
const
186 return QAccessible::queryAccessibleInterface(owner());
189QAccessibleInterface *QAccessibleMenuItem::child(
int index)
const
192 return QAccessible::queryAccessibleInterface(action()->
menu());
196void *QAccessibleMenuItem::interface_cast(QAccessible::InterfaceType
t)
198 if (
t == QAccessible::ActionInterface)
199 return static_cast<QAccessibleActionInterface*
>(
this);
203QObject *QAccessibleMenuItem::object()
const
209QWindow *QAccessibleMenuItem::window()
const
211 return m_owner.isNull()
216QRect QAccessibleMenuItem::rect()
const
220#if QT_CONFIG(menubar)
227 if (
QMenu *
menu = qobject_cast<QMenu*>(own)) {
235QAccessible::Role QAccessibleMenuItem::role()
const
237 return m_action->isSeparator() ? QAccessible::Separator : QAccessible::MenuItem;
240void QAccessibleMenuItem::setText(QAccessible::Text ,
const QString & )
253 if (
QMenu *
menu = qobject_cast<QMenu*>(own)) {
256#if QT_CONFIG(menubar)
264 if (m_action->isSeparator() || !m_action->isEnabled())
266 if (m_action->isChecked())
268 if (m_action->isCheckable())
274QString QAccessibleMenuItem::text(QAccessible::Text
t)
const
278 case QAccessible::Name:
279 str = qt_accStripAmp(m_action->text());
281 case QAccessible::Accelerator: {
282#ifndef QT_NO_SHORTCUT
284 if (!
key.isEmpty()) {
289 str = qt_accHotKey(m_action->text());
299QStringList QAccessibleMenuItem::actionNames()
const
302 if (!m_action || m_action->isSeparator())
305 if (m_action->menu()) {
306 actions << showMenuAction();
308 actions << pressAction();
313void QAccessibleMenuItem::doAction(
const QString &actionName)
315 if (!m_action->isEnabled())
318 if (actionName == pressAction()) {
320 }
else if (actionName == showMenuAction()) {
321#if QT_CONFIG(menubar)
322 if (
QMenuBar *bar = qobject_cast<QMenuBar*>(owner())) {
323 if (m_action->menu() && m_action->menu()->isVisible()) {
324 m_action->menu()->hide();
326 bar->setActiveAction(m_action);
330 if (
QMenu *
menu = qobject_cast<QMenu*>(owner())){
331 if (m_action->menu() && m_action->menu()->isVisible()) {
332 m_action->menu()->hide();
346QAction *QAccessibleMenuItem::action()
const
351QWidget *QAccessibleMenuItem::owner()
const
The QAccessible class provides enums and static functions related to accessibility.
The QAction class provides an abstraction for user commands that can be added to different user inter...
bool isSeparator() const
Returns true if this action is a separator action; otherwise it returns false.
The QKeySequence class encapsulates a key sequence as used by shortcuts.
qsizetype size() const noexcept
void reserve(qsizetype size)
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
virtual int styleHint(StyleHint stylehint, const QStyleOption *opt=nullptr, const QWidget *widget=nullptr, QStyleHintReturn *returnData=nullptr) const =0
Returns an integer representing the specified style hint for the given widget described by the provid...
Combined button and popup list for selecting options.
constexpr QBindableInterface iface
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
#define QT_CONFIG(feature)
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept