Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qwindowsuiamainprovider.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <QtGui/qtguiglobal.h>
5#if QT_CONFIG(accessibility)
6
21#include "qwindowscombase.h"
22#include "qwindowscontext.h"
23#include "qwindowsuiautils.h"
25
26#include <QtCore/qloggingcategory.h>
27#include <QtGui/qaccessible.h>
28#include <QtGui/qguiapplication.h>
29#include <QtGui/qwindow.h>
30
31#if !defined(Q_CC_BOR) && !defined (Q_CC_GNU)
32#include <comdef.h>
33#endif
34
35#include <QtCore/qt_windows.h>
36
38
39using namespace QWindowsUiAutomation;
40
41QMutex QWindowsUiaMainProvider::m_mutex;
42
43// Returns a cached instance of the provider for a specific accessible interface.
44QWindowsUiaMainProvider *QWindowsUiaMainProvider::providerForAccessible(QAccessibleInterface *accessible)
45{
46 QMutexLocker locker(&m_mutex);
47
48 if (!accessible)
49 return nullptr;
50
51 QAccessible::Id id = QAccessible::uniqueId(accessible);
52 QWindowsUiaProviderCache *providerCache = QWindowsUiaProviderCache::instance();
53 auto *provider = qobject_cast<QWindowsUiaMainProvider *>(providerCache->providerForId(id));
54
55 if (provider) {
56 provider->AddRef();
57 } else {
58 provider = new QWindowsUiaMainProvider(accessible);
59 providerCache->insert(id, provider);
60 }
61 return provider;
62}
63
64QWindowsUiaMainProvider::QWindowsUiaMainProvider(QAccessibleInterface *a, int initialRefCount)
65 : QWindowsUiaBaseProvider(QAccessible::uniqueId(a)),
66 m_ref(initialRefCount)
67{
68}
69
70QWindowsUiaMainProvider::~QWindowsUiaMainProvider()
71{
72}
73
74void QWindowsUiaMainProvider::notifyFocusChange(QAccessibleEvent *event)
75{
76 if (QAccessibleInterface *accessible = event->accessibleInterface()) {
77 // If this is a complex element, raise event for the focused child instead.
78 if (accessible->childCount()) {
79 if (QAccessibleInterface *child = accessible->focusChild())
80 accessible = child;
81 }
82 if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible))
84 }
85}
86
87void QWindowsUiaMainProvider::notifyStateChange(QAccessibleStateChangeEvent *event)
88{
89 if (QAccessibleInterface *accessible = event->accessibleInterface()) {
90 if (event->changedStates().checked || event->changedStates().checkStateMixed) {
91 // Notifies states changes in checkboxes.
92 if (accessible->role() == QAccessible::CheckBox) {
93 if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
94 VARIANT oldVal, newVal;
95 clearVariant(&oldVal);
96 int toggleState = ToggleState_Off;
97 if (accessible->state().checked)
98 toggleState = accessible->state().checkStateMixed ? ToggleState_Indeterminate : ToggleState_On;
99 setVariantI4(toggleState, &newVal);
101 }
102 }
103 }
104 if (event->changedStates().active) {
105 if (accessible->role() == QAccessible::Window) {
106 // Notifies window opened/closed.
107 if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
108 if (accessible->state().active) {
110 if (QAccessibleInterface *focused = accessible->focusChild()) {
111 if (QWindowsUiaMainProvider *focusedProvider = providerForAccessible(focused))
113 }
114 } else {
116 }
117 }
118 }
119 }
120 }
121}
122
123void QWindowsUiaMainProvider::notifyValueChange(QAccessibleValueChangeEvent *event)
124{
125 if (QAccessibleInterface *accessible = event->accessibleInterface()) {
126 if (accessible->role() == QAccessible::ComboBox && accessible->childCount() > 0) {
127 QAccessibleInterface *listacc = accessible->child(0);
128 if (listacc && listacc->role() == QAccessible::List) {
129 int count = listacc->childCount();
130 for (int i = 0; i < count; ++i) {
131 QAccessibleInterface *item = listacc->child(i);
132 if (item && item->isValid() && item->text(QAccessible::Name) == event->value()) {
133 if (!item->state().selected) {
134 if (QAccessibleActionInterface *actionInterface = item->actionInterface())
135 actionInterface->doAction(QAccessibleActionInterface::toggleAction());
136 }
137 break;
138 }
139 }
140 }
141 }
142 if (event->value().typeId() == QMetaType::QString) {
143 if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
144
145 // Tries to notify the change using UiaRaiseNotificationEvent(), which is only available on
146 // Windows 10 version 1709 or newer. Otherwise uses UiaRaiseAutomationPropertyChangedEvent().
147
148 BSTR displayString = bStrFromQString(event->value().toString());
149 BSTR activityId = bStrFromQString(QString());
150
153 displayString, activityId);
154
155 ::SysFreeString(displayString);
156 ::SysFreeString(activityId);
157
158 if (hr == static_cast<HRESULT>(UIA_E_NOTSUPPORTED)) {
159 VARIANT oldVal, newVal;
160 clearVariant(&oldVal);
161 setVariantString(event->value().toString(), &newVal);
163 ::SysFreeString(newVal.bstrVal);
164 }
165 }
166 } else if (QAccessibleValueInterface *valueInterface = accessible->valueInterface()) {
167 if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
168 // Notifies changes in values of controls supporting the value interface.
169 VARIANT oldVal, newVal;
170 clearVariant(&oldVal);
171 setVariantDouble(valueInterface->currentValue().toDouble(), &newVal);
173 }
174 }
175 }
176}
177
178void QWindowsUiaMainProvider::notifyNameChange(QAccessibleEvent *event)
179{
180 if (QAccessibleInterface *accessible = event->accessibleInterface()) {
181 // Restrict notification to combo boxes, which need it for accessibility,
182 // in order to avoid slowdowns with unnecessary notifications.
183 if (accessible->role() == QAccessible::ComboBox) {
184 if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
185 VARIANT oldVal, newVal;
186 clearVariant(&oldVal);
187 setVariantString(accessible->text(QAccessible::Name), &newVal);
189 ::SysFreeString(newVal.bstrVal);
190 }
191 }
192 }
193}
194
195void QWindowsUiaMainProvider::notifySelectionChange(QAccessibleEvent *event)
196{
197 if (QAccessibleInterface *accessible = event->accessibleInterface()) {
198 if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
200 }
201 }
202}
203
204// Notifies changes in text content and selection state of text controls.
205void QWindowsUiaMainProvider::notifyTextChange(QAccessibleEvent *event)
206{
207 if (QAccessibleInterface *accessible = event->accessibleInterface()) {
208 if (accessible->textInterface()) {
209 if (QWindowsUiaMainProvider *provider = providerForAccessible(accessible)) {
210 if (event->type() == QAccessible::TextSelectionChanged) {
212 } else if (event->type() == QAccessible::TextCaretMoved) {
213 if (!accessible->state().readOnly) {
215 }
216 } else {
218 }
219 }
220 }
221 }
222}
223
224HRESULT STDMETHODCALLTYPE QWindowsUiaMainProvider::QueryInterface(REFIID iid, LPVOID *iface)
225{
226 if (!iface)
227 return E_INVALIDARG;
228 *iface = nullptr;
229
230 QAccessibleInterface *accessible = accessibleInterface();
231
232 const bool result = qWindowsComQueryUnknownInterfaceMulti<IRawElementProviderSimple>(this, iid, iface)
233 || qWindowsComQueryInterface<IRawElementProviderSimple>(this, iid, iface)
234 || qWindowsComQueryInterface<IRawElementProviderFragment>(this, iid, iface)
235 || (accessible && hwndForAccessible(accessible) && qWindowsComQueryInterface<IRawElementProviderFragmentRoot>(this, iid, iface));
236 return result ? S_OK : E_NOINTERFACE;
237}
238
239ULONG QWindowsUiaMainProvider::AddRef()
240{
241 return ++m_ref;
242}
243
244ULONG STDMETHODCALLTYPE QWindowsUiaMainProvider::Release()
245{
246 QMutexLocker locker(&m_mutex);
247
248 if (!--m_ref) {
249 delete this;
250 return 0;
251 }
252 return m_ref;
253}
254
255HRESULT QWindowsUiaMainProvider::get_ProviderOptions(ProviderOptions *pRetVal)
256{
257 if (!pRetVal)
258 return E_INVALIDARG;
259 // We are STA, (OleInitialize()).
261 return S_OK;
262}
263
264// Return providers for specific control patterns
265HRESULT QWindowsUiaMainProvider::GetPatternProvider(PATTERNID idPattern, IUnknown **pRetVal)
266{
267 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << idPattern;
268
269 if (!pRetVal)
270 return E_INVALIDARG;
271 *pRetVal = nullptr;
272
273 QAccessibleInterface *accessible = accessibleInterface();
274 if (!accessible)
276
277 switch (idPattern) {
279 if (accessible->parent() && (accessible->parent()->role() == QAccessible::Application)) {
280 *pRetVal = new QWindowsUiaWindowProvider(id());
281 }
282 break;
285 // All text controls.
286 if (accessible->textInterface()) {
287 *pRetVal = new QWindowsUiaTextProvider(id());
288 }
289 break;
291 // All non-static controls support the Value pattern.
292 if (accessible->role() != QAccessible::StaticText)
293 *pRetVal = new QWindowsUiaValueProvider(id());
294 break;
296 // Controls providing a numeric value within a range (e.g., sliders, scroll bars, dials).
297 if (accessible->valueInterface()) {
298 *pRetVal = new QWindowsUiaRangeValueProvider(id());
299 }
300 break;
302 // Checkboxes and other checkable controls.
303 if (accessible->state().checkable)
304 *pRetVal = new QWindowsUiaToggleProvider(id());
305 break;
307 // Lists of items.
308 if (accessible->role() == QAccessible::List
309 || accessible->role() == QAccessible::PageTabList) {
310 *pRetVal = new QWindowsUiaSelectionProvider(id());
311 }
312 break;
314 // Items within a list and radio buttons.
315 if ((accessible->role() == QAccessible::RadioButton)
316 || (accessible->role() == QAccessible::ListItem)
317 || (accessible->role() == QAccessible::PageTab)) {
318 *pRetVal = new QWindowsUiaSelectionItemProvider(id());
319 }
320 break;
322 // Table/tree.
323 if (accessible->tableInterface()
324 && ((accessible->role() == QAccessible::Table) || (accessible->role() == QAccessible::Tree))) {
325 *pRetVal = new QWindowsUiaTableProvider(id());
326 }
327 break;
329 // Item within a table/tree.
330 if (accessible->tableCellInterface()
331 && ((accessible->role() == QAccessible::Cell) || (accessible->role() == QAccessible::TreeItem))) {
332 *pRetVal = new QWindowsUiaTableItemProvider(id());
333 }
334 break;
336 // Table/tree.
337 if (accessible->tableInterface()
338 && ((accessible->role() == QAccessible::Table) || (accessible->role() == QAccessible::Tree))) {
339 *pRetVal = new QWindowsUiaGridProvider(id());
340 }
341 break;
343 // Item within a table/tree.
344 if (accessible->tableCellInterface()
345 && ((accessible->role() == QAccessible::Cell) || (accessible->role() == QAccessible::TreeItem))) {
346 *pRetVal = new QWindowsUiaGridItemProvider(id());
347 }
348 break;
350 // Things that have an invokable action (e.g., simple buttons).
351 if (accessible->actionInterface()) {
352 *pRetVal = new QWindowsUiaInvokeProvider(id());
353 }
354 break;
356 // Menu items with submenus.
357 if ((accessible->role() == QAccessible::MenuItem
358 && accessible->childCount() > 0
359 && accessible->child(0)->role() == QAccessible::PopupMenu)
360 || accessible->role() == QAccessible::ComboBox
361 || (accessible->role() == QAccessible::TreeItem && accessible->state().expandable)) {
362 *pRetVal = new QWindowsUiaExpandCollapseProvider(id());
363 }
364 break;
365 default:
366 break;
367 }
368
369 return S_OK;
370}
371
372HRESULT QWindowsUiaMainProvider::GetPropertyValue(PROPERTYID idProp, VARIANT *pRetVal)
373{
374 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << idProp;
375
376 if (!pRetVal)
377 return E_INVALIDARG;
378 clearVariant(pRetVal);
379
380 QAccessibleInterface *accessible = accessibleInterface();
381 if (!accessible)
383
384 bool topLevelWindow = accessible->parent() && (accessible->parent()->role() == QAccessible::Application);
385
386 switch (idProp) {
388 // PID
389 setVariantI4(int(GetCurrentProcessId()), pRetVal);
390 break;
392 // Accelerator key.
393 setVariantString(accessible->text(QAccessible::Accelerator), pRetVal);
394 break;
396 // Automation ID, which can be used by tools to select a specific control in the UI.
397 setVariantString(automationIdForAccessible(accessible), pRetVal);
398 break;
400 // Class name.
401 if (QObject *o = accessible->object()) {
402 QString className = QLatin1StringView(o->metaObject()->className());
403 setVariantString(className, pRetVal);
404 }
405 break;
407 setVariantString(QStringLiteral("Qt"), pRetVal);
408 break;
410 if (topLevelWindow) {
411 // Reports a top-level widget as a window, instead of "custom".
412 setVariantI4(UIA_WindowControlTypeId, pRetVal);
413 } else {
414 // Control type converted from role.
415 auto controlType = roleToControlTypeId(accessible->role());
416
417 // The native OSK should be disabled if the Qt OSK is in use,
418 // or if disabled via application attribute.
419 static bool imModuleEmpty = qEnvironmentVariableIsEmpty("QT_IM_MODULE");
421
422 // If we want to disable the native OSK auto-showing
423 // we have to report text fields as non-editable.
424 if (controlType == UIA_EditControlTypeId && (!imModuleEmpty || nativeVKDisabled))
425 controlType = UIA_TextControlTypeId;
426
427 setVariantI4(controlType, pRetVal);
428 }
429 break;
431 setVariantString(accessible->text(QAccessible::Help), pRetVal);
432 break;
434 if (topLevelWindow) {
435 // Windows set the active state to true when they are focused
436 setVariantBool(accessible->state().active, pRetVal);
437 } else {
438 setVariantBool(accessible->state().focused, pRetVal);
439 }
440 break;
442 if (topLevelWindow) {
443 // Windows should always be focusable
444 setVariantBool(true, pRetVal);
445 } else {
446 setVariantBool(accessible->state().focusable, pRetVal);
447 }
448 break;
450 setVariantBool(accessible->state().offscreen, pRetVal);
451 break;
453 setVariantBool(true, pRetVal);
454 break;
456 setVariantBool(true, pRetVal);
457 break;
459 setVariantBool(!accessible->state().disabled, pRetVal);
460 break;
462 setVariantBool(accessible->role() == QAccessible::EditableText
463 && accessible->state().passwordEdit, pRetVal);
464 break;
466 // True for peripheral UIs.
467 if (QWindow *window = windowForAccessible(accessible)) {
468 const Qt::WindowType wt = window->type();
469 setVariantBool(wt == Qt::Popup || wt == Qt::ToolTip || wt == Qt::SplashScreen, pRetVal);
470 }
471 break;
473 setVariantBool(accessible->role() == QAccessible::Dialog
474 || accessible->role() == QAccessible::AlertMessage, pRetVal);
475 break;
477 setVariantString(accessible->text(QAccessible::Description), pRetVal);
478 break;
479 case UIA_NamePropertyId: {
480 QString name = accessible->text(QAccessible::Name);
481 if (name.isEmpty() && topLevelWindow)
483 setVariantString(name, pRetVal);
484 break;
485 }
486 default:
487 break;
488 }
489 return S_OK;
490}
491
492// Generates an ID based on the name of the controls and their parents.
493QString QWindowsUiaMainProvider::automationIdForAccessible(const QAccessibleInterface *accessible)
494{
496 if (accessible) {
497 QObject *obj = accessible->object();
498 while (obj) {
499 QString name = obj->objectName();
500 if (name.isEmpty())
501 return result;
502 if (!result.isEmpty())
503 result.prepend(u'.');
504 result.prepend(name);
505 obj = obj->parent();
506 }
507 }
508 return result;
509}
510
511HRESULT QWindowsUiaMainProvider::get_HostRawElementProvider(IRawElementProviderSimple **pRetVal)
512{
513 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << this;
514
515 if (!pRetVal)
516 return E_INVALIDARG;
517 *pRetVal = nullptr;
518
519 // Returns a host provider only for controls associated with a native window handle. Others should return NULL.
520 if (QAccessibleInterface *accessible = accessibleInterface()) {
521 if (HWND hwnd = hwndForAccessible(accessible)) {
523 }
524 }
525 return S_OK;
526}
527
528// Navigates within the tree of accessible controls.
529HRESULT QWindowsUiaMainProvider::Navigate(NavigateDirection direction, IRawElementProviderFragment **pRetVal)
530{
531 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << direction << " this: " << this;
532
533 if (!pRetVal)
534 return E_INVALIDARG;
535 *pRetVal = nullptr;
536
537 QAccessibleInterface *accessible = accessibleInterface();
538 if (!accessible)
540
541 QAccessibleInterface *targetacc = nullptr;
542
544 if (QAccessibleInterface *parent = accessible->parent()) {
545 // The Application's children are considered top level objects.
546 if (parent->isValid() && parent->role() != QAccessible::Application) {
547 targetacc = parent;
548 }
549 }
550 } else {
551 QAccessibleInterface *parent = nullptr;
552 int index = 0;
553 int incr = 1;
554 switch (direction) {
556 parent = accessible;
557 index = 0;
558 incr = 1;
559 break;
561 parent = accessible;
562 index = accessible->childCount() - 1;
563 incr = -1;
564 break;
566 if ((parent = accessible->parent()))
567 index = parent->indexOfChild(accessible) + 1;
568 incr = 1;
569 break;
571 if ((parent = accessible->parent()))
572 index = parent->indexOfChild(accessible) - 1;
573 incr = -1;
574 break;
575 default:
576 Q_UNREACHABLE();
577 break;
578 }
579
580 if (parent && parent->isValid()) {
581 for (int count = parent->childCount(); index >= 0 && index < count; index += incr) {
582 if (QAccessibleInterface *child = parent->child(index)) {
583 if (child->isValid() && !child->state().invisible) {
584 targetacc = child;
585 break;
586 }
587 }
588 }
589 }
590 }
591
592 if (targetacc)
593 *pRetVal = providerForAccessible(targetacc);
594 return S_OK;
595}
596
597// Returns a unique id assigned to the UI element, used as key by the UI Automation framework.
598HRESULT QWindowsUiaMainProvider::GetRuntimeId(SAFEARRAY **pRetVal)
599{
600 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << this;
601
602 if (!pRetVal)
603 return E_INVALIDARG;
604 *pRetVal = nullptr;
605
606 QAccessibleInterface *accessible = accessibleInterface();
607 if (!accessible)
609
610 // The UiaAppendRuntimeId constant is used to make then ID unique
611 // among multiple instances running on the system.
612 int rtId[] = { UiaAppendRuntimeId, int(id()) };
613
614 if ((*pRetVal = SafeArrayCreateVector(VT_I4, 0, 2))) {
615 for (LONG i = 0; i < 2; ++i)
616 SafeArrayPutElement(*pRetVal, &i, &rtId[i]);
617 }
618 return S_OK;
619}
620
621// Returns the bounding rectangle for the accessible control.
622HRESULT QWindowsUiaMainProvider::get_BoundingRectangle(UiaRect *pRetVal)
623{
624 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << this;
625
626 if (!pRetVal)
627 return E_INVALIDARG;
628
629 QAccessibleInterface *accessible = accessibleInterface();
630 if (!accessible)
632
633 QWindow *window = windowForAccessible(accessible);
634 if (!window)
636
637 rectToNativeUiaRect(accessible->rect(), window, pRetVal);
638 return S_OK;
639}
640
641HRESULT QWindowsUiaMainProvider::GetEmbeddedFragmentRoots(SAFEARRAY **pRetVal)
642{
643 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << this;
644
645 if (!pRetVal)
646 return E_INVALIDARG;
647 *pRetVal = nullptr;
648 // No embedded roots.
649 return S_OK;
650}
651
652// Sets focus to the control.
653HRESULT QWindowsUiaMainProvider::SetFocus()
654{
655 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << this;
656
657 QAccessibleInterface *accessible = accessibleInterface();
658 if (!accessible)
660
661 QAccessibleActionInterface *actionInterface = accessible->actionInterface();
662 if (!actionInterface)
664
665 actionInterface->doAction(QAccessibleActionInterface::setFocusAction());
666 return S_OK;
667}
668
669HRESULT QWindowsUiaMainProvider::get_FragmentRoot(IRawElementProviderFragmentRoot **pRetVal)
670{
671 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << this;
672
673 if (!pRetVal)
674 return E_INVALIDARG;
675 *pRetVal = nullptr;
676
677 // Our UI Automation implementation considers the window as the root for
678 // non-native controls/fragments.
679 if (QAccessibleInterface *accessible = accessibleInterface()) {
680 if (QWindow *window = windowForAccessible(accessible)) {
681 if (QAccessibleInterface *rootacc = window->accessibleRoot()) {
682 *pRetVal = providerForAccessible(rootacc);
683 }
684 }
685 }
686 return S_OK;
687}
688
689// Returns a provider for the UI element present at the specified screen coordinates.
690HRESULT QWindowsUiaMainProvider::ElementProviderFromPoint(double x, double y, IRawElementProviderFragment **pRetVal)
691{
692 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << x << y;
693
694 if (!pRetVal) {
695 return E_INVALIDARG;
696 }
697 *pRetVal = nullptr;
698
699 QAccessibleInterface *accessible = accessibleInterface();
700 if (!accessible)
702
703 QWindow *window = windowForAccessible(accessible);
704 if (!window)
706
707 // Scales coordinates from High DPI screens.
708 UiaPoint uiaPoint = {x, y};
709 QPoint point;
710 nativeUiaPointToPoint(uiaPoint, window, &point);
711
712 QAccessibleInterface *targetacc = accessible->childAt(point.x(), point.y());
713
714 if (targetacc) {
715 QAccessibleInterface *acc = targetacc;
716 // Controls can be embedded within grouping elements. By default returns the innermost control.
717 while (acc) {
718 targetacc = acc;
719 // For accessibility tools it may be better to return the text element instead of its subcomponents.
720 if (targetacc->textInterface()) break;
721 acc = acc->childAt(point.x(), point.y());
722 }
723 *pRetVal = providerForAccessible(targetacc);
724 }
725 return S_OK;
726}
727
728// Returns the fragment with focus.
729HRESULT QWindowsUiaMainProvider::GetFocus(IRawElementProviderFragment **pRetVal)
730{
731 qCDebug(lcQpaUiAutomation) << __FUNCTION__ << this;
732
733 if (!pRetVal)
734 return E_INVALIDARG;
735 *pRetVal = nullptr;
736
737 if (QAccessibleInterface *accessible = accessibleInterface()) {
738 if (QAccessibleInterface *focusacc = accessible->focusChild()) {
739 *pRetVal = providerForAccessible(focusacc);
740 }
741 }
742 return S_OK;
743}
744
746
747#endif // QT_CONFIG(accessibility)
The QAccessible class provides enums and static functions related to accessibility.
static bool testAttribute(Qt::ApplicationAttribute attribute)
Returns true if attribute attribute is set; otherwise returns false.
QString applicationName
the name of this application
\inmodule QtCore
Definition qmutex.h:317
\inmodule QtCore
Definition qmutex.h:285
\inmodule QtCore
Definition qobject.h:90
\inmodule QtCore\reentrant
Definition qpoint.h:23
constexpr int x() const noexcept
Returns the x coordinate of this point.
Definition qpoint.h:127
constexpr int y() const noexcept
Returns the y coordinate of this point.
Definition qpoint.h:132
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
\inmodule QtGui
Definition qwindow.h:63
HRESULT raiseNotificationEvent(IRawElementProviderSimple *provider, NotificationKind notificationKind, NotificationProcessing notificationProcessing, BSTR displayString, BSTR activityId)
HRESULT raiseAutomationEvent(IRawElementProviderSimple *pProvider, EVENTID id)
static QWindowsUiaWrapper * instance()
HRESULT raiseAutomationPropertyChangedEvent(IRawElementProviderSimple *pProvider, PROPERTYID id, VARIANT oldValue, VARIANT newValue)
HRESULT hostProviderFromHwnd(HWND hwnd, IRawElementProviderSimple **ppProvider)
direction
Combined button and popup list for selecting options.
constexpr QBindableInterface iface
Definition qproperty.h:664
@ AA_DisableNativeVirtualKeyboard
Definition qnamespace.h:433
WindowType
Definition qnamespace.h:204
@ ToolTip
Definition qnamespace.h:212
@ Popup
Definition qnamespace.h:210
@ SplashScreen
Definition qnamespace.h:213
#define qCDebug(category,...)
GLint GLint GLint GLint GLint x
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLuint index
[2]
GLenum GLenum GLsizei count
GLuint name
GLint y
struct _cl_event * event
GLhandleARB obj
[2]
GLuint64EXT * result
[6]
#define QStringLiteral(str)
Q_CORE_EXPORT bool qEnvironmentVariableIsEmpty(const char *varName) noexcept
long HRESULT
const char className[16]
[1]
Definition qwizard.cpp:100
QGraphicsItem * item
QLayoutItem * child
[0]
aWidget window() -> setWindowTitle("New Window Title")
[2]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent
#define UIA_EditControlTypeId
#define UIA_WindowControlTypeId
#define UIA_TextControlTypeId
#define UIA_E_ELEMENTNOTAVAILABLE
#define UIA_E_NOTSUPPORTED
#define UIA_Window_WindowClosedEventId
#define UIA_Text_TextSelectionChangedEventId
#define UIA_SelectionItem_ElementSelectedEventId
#define UIA_Window_WindowOpenedEventId
#define UIA_AutomationFocusChangedEventId
#define UIA_Text_TextChangedEventId
#define UiaAppendRuntimeId
#define UIA_InvokePatternId
#define UIA_ValuePatternId
#define UIA_TextPattern2Id
#define UIA_GridItemPatternId
#define UIA_GridPatternId
#define UIA_TextPatternId
#define UIA_SelectionPatternId
#define UIA_ExpandCollapsePatternId
#define UIA_TableItemPatternId
#define UIA_TogglePatternId
#define UIA_TablePatternId
#define UIA_WindowPatternId
#define UIA_RangeValuePatternId
#define UIA_SelectionItemPatternId
#define UIA_AutomationIdPropertyId
#define UIA_HasKeyboardFocusPropertyId
#define UIA_AccessKeyPropertyId
#define UIA_IsControlElementPropertyId
#define UIA_IsEnabledPropertyId
#define UIA_ProcessIdPropertyId
#define UIA_IsPeripheralPropertyId
#define UIA_ClassNamePropertyId
#define UIA_HelpTextPropertyId
#define UIA_IsContentElementPropertyId
#define UIA_ValueValuePropertyId
#define UIA_RangeValueValuePropertyId
#define UIA_ControlTypePropertyId
#define UIA_ToggleToggleStatePropertyId
#define UIA_IsOffscreenPropertyId
#define UIA_IsDialogPropertyId
#define UIA_NamePropertyId
#define UIA_FrameworkIdPropertyId
#define UIA_FullDescriptionPropertyId
#define UIA_IsKeyboardFocusablePropertyId
#define UIA_IsPasswordPropertyId
interface IRawElementProviderFragment IRawElementProviderFragment
interface IRawElementProviderFragmentRoot IRawElementProviderFragmentRoot
IRawElementProviderFragment __RPC__deref_out_opt IRawElementProviderFragment ** pRetVal
int PATTERNID
Definition uiatypes_p.h:19
@ NotificationProcessing_ImportantMostRecent
Definition uiatypes_p.h:139
ProviderOptions
Definition uiatypes_p.h:36
@ ProviderOptions_ServerSideProvider
Definition uiatypes_p.h:38
@ ProviderOptions_UseComThreading
Definition uiatypes_p.h:42
@ NotificationKind_Other
Definition uiatypes_p.h:134
int PROPERTYID
Definition uiatypes_p.h:18
NavigateDirection
Definition uiatypes_p.h:28
@ NavigateDirection_NextSibling
Definition uiatypes_p.h:30
@ NavigateDirection_PreviousSibling
Definition uiatypes_p.h:31
@ NavigateDirection_Parent
Definition uiatypes_p.h:29
@ NavigateDirection_LastChild
Definition uiatypes_p.h:33
@ NavigateDirection_FirstChild
Definition uiatypes_p.h:32
@ ToggleState_On
Definition uiatypes_p.h:77
@ ToggleState_Indeterminate
Definition uiatypes_p.h:78
@ ToggleState_Off
Definition uiatypes_p.h:76