7#include <QtGui/private/qaccessiblehelper_p.h>
8#include <QtGui/qtextdocument.h>
10#include "QtQuick/private/qquickitem_p.h"
11#include "QtQuick/private/qquicktext_p.h"
12#include <private/qquicktext_p_p.h>
14#include "QtQuick/private/qquicktextinput_p.h"
15#include "QtQuick/private/qquickaccessibleattached_p.h"
16#include "QtQuick/qquicktextdocument.h"
17#include "QtQuick/qquickrendercontrol.h"
20#if QT_CONFIG(accessibility)
22class QAccessibleHyperlink :
public QAccessibleInterface,
public QAccessibleHyperlinkInterface {
24 QAccessibleHyperlink(QQuickItem *parentTextItem,
int linkIndex);
27 bool isValid()
const override;
28 QObject *object()
const override;
29 QWindow *window()
const override;
32 QAccessibleInterface *parent()
const override;
33 QAccessibleInterface *child(
int index)
const override;
34 int childCount()
const override;
35 int indexOfChild(
const QAccessibleInterface *iface)
const override;
36 QAccessibleInterface *childAt(
int x,
int y)
const override;
39 QString text(QAccessible::Text)
const override;
40 void setText(QAccessible::Text,
const QString &text) override;
41 QRect rect()
const override;
42 QAccessible::Role role()
const override;
43 QAccessible::State state()
const override;
45 void *interface_cast(QAccessible::InterfaceType t) override;
48 QString anchor()
const override
50 const QList<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
51 if (linkIndex < links.size())
52 return links.at(linkIndex).m_anchor;
56 QString anchorTarget()
const override
58 const QList<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
59 if (linkIndex < links.size())
60 return links.at(linkIndex).m_anchorTarget;
64 int startIndex()
const override
66 const QList<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
67 if (linkIndex < links.size())
68 return links.at(linkIndex).m_startIndex;
72 int endIndex()
const override
74 const QList<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
75 if (linkIndex < links.size())
76 return links.at(linkIndex).m_endIndex;
81 QQuickText *textItem()
const {
return qobject_cast<QQuickText*>(parentTextItem); }
82 QQuickItem *parentTextItem;
85 friend class QAccessibleQuickItem;
89QAccessibleHyperlink::QAccessibleHyperlink(QQuickItem *parentTextItem,
int linkIndex)
90 : parentTextItem(parentTextItem),
96bool QAccessibleHyperlink::isValid()
const
102QObject *QAccessibleHyperlink::object()
const
108QWindow *QAccessibleHyperlink::window()
const
110 return textItem()->window();
115QRect QAccessibleHyperlink::rect()
const
117 const QList<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
118 if (linkIndex < links.size()) {
119 const QPoint tl = itemScreenRect(textItem()).topLeft();
120 return links.at(linkIndex).rect.translated(tl);
126QAccessibleInterface *QAccessibleHyperlink::childAt(
int,
int)
const
132QAccessibleInterface *QAccessibleHyperlink::parent()
const
134 return QAccessible::queryAccessibleInterface(textItem());
138QAccessibleInterface *QAccessibleHyperlink::child(
int)
const
144int QAccessibleHyperlink::childCount()
const
150int QAccessibleHyperlink::indexOfChild(
const QAccessibleInterface *)
const
156QAccessible::State QAccessibleHyperlink::state()
const
158 QAccessible::State s;
161 s.selectableText =
true;
167QAccessible::Role QAccessibleHyperlink::role()
const
169 return QAccessible::Link;
173QString QAccessibleHyperlink::text(QAccessible::Text t)
const
183 if (t == QAccessible::Name)
185 if (t == QAccessible::Value)
186 return anchorTarget();
191void QAccessibleHyperlink::setText(QAccessible::Text,
const QString &)
197void *QAccessibleHyperlink::interface_cast(QAccessible::InterfaceType t)
199 if (t == QAccessible::HyperlinkInterface)
200 return static_cast<QAccessibleHyperlinkInterface*>(
this);
206
207
208
209
210QAccessibleQuickItem::QAccessibleQuickItem(QQuickItem *item)
211 : QAccessibleObject(item), m_doc(textDocument())
215bool QAccessibleQuickItem::isValid()
const
217 return item() && !QQuickItemPrivate::get(item())->inDestructor;
221QWindow *QAccessibleQuickItem::window()
const
223 QQuickWindow *window = item()->window();
228 if (window && !window->handle()) {
229 if (QQuickRenderControl *renderControl = QQuickWindowPrivate::get(window)->renderControl) {
230 if (QWindow *renderWindow = renderControl->renderWindow(
nullptr))
238int QAccessibleQuickItem::childCount()
const
242 if (QQuickText *textItem = qobject_cast<QQuickText*>(item())) {
243 cc = QQuickTextPrivate::get(textItem)->getLinks().size();
245 cc += childItems().size();
249QRect QAccessibleQuickItem::rect()
const
251 const QRect r = itemScreenRect(item());
255QRect QAccessibleQuickItem::viewRect()
const
258 if (!item()->window()) {
262 QQuickWindow *window = item()->window();
263 QPoint screenPos = window->mapToGlobal(QPoint(0,0));
264 return QRect(screenPos, window->size());
268bool QAccessibleQuickItem::clipsChildren()
const
270 return static_cast<QQuickItem *>(item())->clip();
273QAccessibleInterface *QAccessibleQuickItem::childAt(
int x,
int y)
const
275 if (item()->clip()) {
276 if (!rect().contains(x, y))
281 if (QQuickText *textItem = qobject_cast<QQuickText*>(item())) {
282 const auto hyperLinkChildCount = QQuickTextPrivate::get(textItem)->getLinks().size();
283 for (
auto i = 0; i < hyperLinkChildCount; i++) {
284 QAccessibleInterface *iface = child(i);
285 if (iface->rect().contains(x,y)) {
292 const QList<QQuickItem*> kids = accessibleUnignoredChildren(item(),
true);
293 for (
int i = kids.size() - 1; i >= 0; --i) {
294 QAccessibleInterface *childIface = QAccessible::queryAccessibleInterface(kids.at(i));
295 if (QAccessibleInterface *childChild = childIface->childAt(x, y))
297 if (childIface && !childIface->state().invisible) {
298 if (childIface->rect().contains(x, y))
306QAccessibleInterface *QAccessibleQuickItem::parent()
const
308 QQuickItem *parent = item()->parentItem();
309 QQuickWindow *itemWindow = item()->window();
310 QQuickItem *ci = itemWindow ? itemWindow->contentItem() :
nullptr;
311 while (parent && !QQuickItemPrivate::get(parent)->isAccessible && parent != ci)
312 parent = parent->parentItem();
316 if (
auto *iface = itemWindow->accessibleRoot())
319 return QAccessible::queryAccessibleInterface(window());
321 while (parent && !parent->d_func()->isAccessible)
322 parent = parent->parentItem();
323 return QAccessible::queryAccessibleInterface(parent);
329QAccessibleInterface *QAccessibleQuickItem::child(
int index)
const
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
356 if (QQuickText *textItem = qobject_cast<QQuickText*>(item())) {
357 const int hyperLinkChildCount = QQuickTextPrivate::get(textItem)->getLinks().size();
358 if (index < hyperLinkChildCount) {
359 auto it = m_childToId.constFind(index);
360 if (it != m_childToId.constEnd())
361 return QAccessible::accessibleInterface(it.value());
363 QAccessibleHyperlink *iface =
new QAccessibleHyperlink(item(), index);
364 QAccessible::Id id = QAccessible::registerAccessibleInterface(iface);
365 m_childToId.insert(index, id);
368 index -= hyperLinkChildCount;
371 QList<QQuickItem *> children = childItems();
372 if (index < children.size()) {
373 QQuickItem *child = children.at(index);
374 return QAccessible::queryAccessibleInterface(child);
379int QAccessibleQuickItem::indexOfChild(
const QAccessibleInterface *iface)
const
381 int hyperLinkChildCount = 0;
382 if (QQuickText *textItem = qobject_cast<QQuickText*>(item())) {
383 hyperLinkChildCount = QQuickTextPrivate::get(textItem)->getLinks().size();
384 if (QAccessibleHyperlinkInterface *hyperLinkIface =
const_cast<QAccessibleInterface *>(iface)->hyperlinkInterface()) {
387 QAccessibleHyperlink *hyperLink =
static_cast<QAccessibleHyperlink*>(hyperLinkIface);
388 if (hyperLink->textItem() ==
static_cast<QQuickText*>(item())) {
389 return hyperLink->linkIndex;
393 QList<QQuickItem*> kids = childItems();
394 int idx = kids.indexOf(
static_cast<QQuickItem*>(iface->object()));
396 idx += hyperLinkChildCount;
400static void unignoredChildren(QQuickItem *item, QList<QQuickItem *> *items,
bool paintOrder)
402 const QList<QQuickItem*> childItems = paintOrder ? QQuickItemPrivate::get(item)->paintOrderChildItems()
403 : item->childItems();
404 for (QQuickItem *child : childItems) {
405 if (QQuickItemPrivate::get(child)->isAccessible) {
406 items->append(child);
408 unignoredChildren(child, items, paintOrder);
413QList<QQuickItem *> accessibleUnignoredChildren(QQuickItem *item,
bool paintOrder)
415 QList<QQuickItem *> items;
416 unignoredChildren(item, &items, paintOrder);
420QList<QQuickItem *> QAccessibleQuickItem::childItems()
const
422 return accessibleUnignoredChildren(item());
425static bool isTextRole(QAccessible::Role role)
427 return role == QAccessible::EditableText || role == QAccessible::StaticText;
430QAccessible::State QAccessibleQuickItem::state()
const
432 QAccessible::State state;
433 if (QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(item()))
434 state = attached->state();
436 QRect viewRect_ = viewRect();
437 QRect itemRect = rect();
439 if (viewRect_.isNull() || itemRect.isNull() || !window() || !window()->isVisible() ||!item()->isVisible() || qFuzzyIsNull(item()->opacity()))
440 state.invisible =
true;
441 if (!viewRect_.intersects(itemRect))
442 state.offscreen =
true;
443 if ((role() == QAccessible::CheckBox
444 || role() == QAccessible::RadioButton
445 || role() == QAccessible::Switch)
446 && object()->property(
"checked").toBool())
447 state.checked =
true;
448 if (role() == QAccessible::Button && object()->property(
"expandable").toBool()) {
449 state.expandable =
true;
450 state.expanded = object()->property(
"expanded").toBool();
452 if (item()->activeFocusOnTab() || isTextRole(role()))
453 state.focusable =
true;
454 if (item()->hasActiveFocus())
455 state.focused =
true;
456 if (role() == QAccessible::EditableText)
457 if (
auto ti = qobject_cast<QQuickTextInput *>(item()))
458 state.passwordEdit = ti->echoMode() != QQuickTextInput::Normal;
459 if (!item()->isEnabled()) {
460 state.focusable =
false;
461 state.disabled =
true;
463 if (item()->property(
"readOnly").toBool() || role() == QAccessible::ProgressBar)
464 state.readOnly =
true;
468QList<std::pair<QAccessibleInterface *, QAccessible::Relation>>
469QAccessibleQuickItem::relations(QAccessible::Relation match)
const
471 QList<std::pair<QAccessibleInterface *, QAccessible::Relation>> rels =
472 QAccessibleObject::relations(match);
473 if (QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(item())) {
474 if (match & QAccessible::Labelled) {
475 if (
auto *labelFor = attached->labelFor()) {
476 rels.append({QAccessible::queryAccessibleInterface(labelFor),
477 QAccessible::Labelled});
481 if (match & QAccessible::Label) {
482 if (
auto *labelledBy = attached->labelledBy()) {
483 rels.append({QAccessible::queryAccessibleInterface(labelledBy),
484 QAccessible::Label});
491QAccessible::Role QAccessibleQuickItem::role()
const
497 QAccessible::Role role = QAccessible::NoRole;
499 role = QQuickItemPrivate::get(item())->effectiveAccessibleRole();
500 if (role == QAccessible::NoRole) {
501 if (qobject_cast<QQuickText*>(
const_cast<QQuickItem *>(item())))
502 role = QAccessible::StaticText;
503 else if (qobject_cast<QQuickTextInput*>(
const_cast<QQuickItem *>(item())))
504 role = QAccessible::EditableText;
506 role = QAccessible::Client;
512bool QAccessibleQuickItem::isAccessible()
const
514 return item()->d_func()->isAccessible;
517QStringList QAccessibleQuickItem::actionNames()
const
521 case QAccessible::Button:
522 if (state().expandable)
523 actions << QAccessibleActionInterface::toggleAction();
525 case QAccessible::Link:
526 case QAccessible::MenuItem:
527 actions << QAccessibleActionInterface::pressAction();
529 case QAccessible::RadioButton:
530 case QAccessible::CheckBox:
531 case QAccessible::Switch:
532 actions << QAccessibleActionInterface::toggleAction()
533 << QAccessibleActionInterface::pressAction();
535 case QAccessible::Slider:
536 case QAccessible::SpinBox:
537 case QAccessible::ScrollBar:
538 actions << QAccessibleActionInterface::increaseAction()
539 << QAccessibleActionInterface::decreaseAction();
544 if (state().focusable)
545 actions.append(QAccessibleActionInterface::setFocusAction());
548 if (QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(item()))
549 attached->availableActions(&actions);
553void QAccessibleQuickItem::doAction(
const QString &actionName)
555 bool accepted =
false;
556 if (actionName == QAccessibleActionInterface::setFocusAction()) {
557 item()->forceActiveFocus();
560 if (QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(item()))
561 accepted = attached->doAction(actionName);
567 const QByteArray functionName =
"accessible" + actionName.toLatin1() +
"Action";
568 if (object()->metaObject()->indexOfMethod(QByteArray(functionName +
"()")) != -1) {
569 QMetaObject::invokeMethod(object(), functionName);
579 case QAccessible::RadioButton:
580 case QAccessible::CheckBox:
581 case QAccessible::Switch: {
582 QVariant checked = object()->property(
"checked");
583 if (checked.isValid()) {
584 if (actionName == QAccessibleActionInterface::toggleAction()
585 || actionName == QAccessibleActionInterface::pressAction()) {
586 object()->setProperty(
"checked", QVariant(!checked.toBool()));
591 case QAccessible::Slider:
592 case QAccessible::SpinBox:
593 case QAccessible::Dial:
594 case QAccessible::ScrollBar: {
595 if (actionName != QAccessibleActionInterface::increaseAction() &&
596 actionName != QAccessibleActionInterface::decreaseAction())
602 if (QAccessibleValueInterface *valueIface = valueInterface()) {
603 QVariant valueV = valueIface->currentValue();
604 qreal newValue = valueV.toReal();
606 QVariant stepSizeV = object()->property(
"stepSize");
607 qreal stepSize = stepSizeV.isValid() ? stepSizeV.toReal() : qreal(1.0);
608 if (actionName == QAccessibleActionInterface::increaseAction()) {
609 newValue += stepSize;
611 newValue -= stepSize;
614 QVariant minimumValueV = valueIface->minimumValue();
615 if (minimumValueV.isValid()) {
616 newValue = qMax(newValue, minimumValueV.toReal());
618 QVariant maximumValueV = valueIface->maximumValue();
619 if (maximumValueV.isValid()) {
620 newValue = qMin(newValue, maximumValueV.toReal());
623 valueIface->setCurrentValue(QVariant(newValue));
627 case QAccessible::Button: {
628 QVariant expanded = object()->property(
"expanded");
629 if (expanded.isValid()) {
630 if (actionName == QAccessibleActionInterface::toggleAction()
631 || actionName == QAccessibleActionInterface::pressAction()) {
632 object()->setProperty(
"expanded", QVariant(!expanded.toBool()));
642QStringList QAccessibleQuickItem::keyBindingsForAction(
const QString &actionName)
const
644 Q_UNUSED(actionName);
645 return QStringList();
648QString QAccessibleQuickItem::text(QAccessible::Text textType)
const
652 case QAccessible::Name: {
653 QVariant accessibleName = QQuickAccessibleAttached::property(object(),
"name");
654 if (!accessibleName.isNull())
655 return accessibleName.toString();
657 case QAccessible::Description: {
658 QVariant accessibleDecription = QQuickAccessibleAttached::property(object(),
"description");
659 if (!accessibleDecription.isNull())
660 return accessibleDecription.toString();
662 case QAccessible::Identifier: {
663 QVariant accessibleIdentifier = QQuickAccessibleAttached::property(object(),
"id");
664 if (!accessibleIdentifier.isNull())
665 return accessibleIdentifier.toString();
666 auto quickItem = item();
667 if (quickItem->isComponentComplete()) {
668 QQmlContext *context = qmlContext(quickItem);
670 const auto objectId = context->nameForObject(quickItem);
671 if (!objectId.isEmpty())
676#ifdef Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
677 case QAccessible::DebugDescription: {
679 debugString = QString::fromLatin1(object()->metaObject()->className()) + QLatin1Char(
' ');
680 debugString += isAccessible() ? QLatin1String(
"enabled") : QLatin1String(
"disabled");
684 case QAccessible::Value:
685 case QAccessible::Help:
686 case QAccessible::Accelerator:
692 if (role() == QAccessible::EditableText) {
693 if (textType == QAccessible::Value) {
694 if (
auto textInput = qobject_cast<QQuickTextInput *>(item()))
695 return textInput->displayText();
696 if (QTextDocument *doc = textDocument()) {
697 return doc->toPlainText();
699 QVariant text = object()->property(
"text");
700 return text.toString();
707void QAccessibleQuickItem::setText(QAccessible::Text textType,
const QString &text)
709 if (role() != QAccessible::EditableText)
711 if (textType != QAccessible::Value)
714 if (QTextDocument *doc = textDocument()) {
715 doc->setPlainText(text);
718 auto textPropertyName =
"text";
719 if (object()->metaObject()->indexOfProperty(textPropertyName) >= 0)
720 object()->setProperty(textPropertyName, text);
723void *QAccessibleQuickItem::interface_cast(QAccessible::InterfaceType t)
725 const QAccessible::Role r = role();
727 case QAccessible::ActionInterface:
728 return static_cast<QAccessibleActionInterface*>(
this);
729 case QAccessible::AttributesInterface:
730 return static_cast<QAccessibleAttributesInterface *>(
this);
731 case QAccessible::ValueInterface:
732 if (r == QAccessible::Slider
733 || r == QAccessible::SpinBox
734 || r == QAccessible::Dial
735 || r == QAccessible::ScrollBar
736 || r == QAccessible::ProgressBar) {
737 return static_cast<QAccessibleValueInterface*>(
this);
740 case QAccessible::TextInterface:
741 if (r == QAccessible::EditableText
742 || r == QAccessible::StaticText
743 || r == QAccessible::Heading) {
744 return static_cast<QAccessibleTextInterface*>(
this);
751 return QAccessibleObject::interface_cast(t);
754QVariant QAccessibleQuickItem::currentValue()
const
756 return item()->property(
"value");
759void QAccessibleQuickItem::setCurrentValue(
const QVariant &value)
761 item()->setProperty(
"value", value);
764QVariant QAccessibleQuickItem::maximumValue()
const
766 const auto minimumValue = item()->property(
"minimumValue");
767 const auto maximumValue = item()->property(
"maximumValue");
768 const auto from = item()->property(
"from");
769 const auto to = item()->property(
"to");
771 if (minimumValue.isValid() && maximumValue.isValid())
774 if (from.isValid() && to.isValid())
780QVariant QAccessibleQuickItem::minimumValue()
const
782 const auto minimumValue = item()->property(
"minimumValue");
783 const auto maximumValue = item()->property(
"maximumValue");
784 const auto from = item()->property(
"from");
785 const auto to = item()->property(
"to");
787 if (minimumValue.isValid() && maximumValue.isValid())
790 if (from.isValid() && to.isValid())
796QVariant QAccessibleQuickItem::minimumStepSize()
const
798 return item()->property(
"stepSize");
802
803
804
805QRect itemScreenRect(QQuickItem *item)
809 if (!item->window() ||!item->isVisible() || qFuzzyIsNull(item->opacity())) {
813 QSizeF itemSize(item->width(), item->height());
816 if (itemSize.isEmpty()) {
817 itemSize = QSize(item->implicitWidth(), item->implicitHeight());
818 if (itemSize.isEmpty() && item->parentItem())
820 itemSize = QSize(item->parentItem()->width(), item->parentItem()->height());
823 QRectF sceneRect = item->mapRectToScene(QRectF(QPointF(0, 0), itemSize));
824 QPoint screenPos = item->window()->mapToGlobal(sceneRect.topLeft().toPoint());
825 QSize screenSize = sceneRect.size().toSize();
826 return QRect(screenPos, screenSize);
829QTextDocument *QAccessibleQuickItem::textDocument()
const
831 QVariant docVariant = item()->property(
"textDocument");
832 if (docVariant.canConvert<QQuickTextDocument*>()) {
833 QQuickTextDocument *qqdoc = docVariant.value<QQuickTextDocument*>();
834 return qqdoc->textDocument();
839int QAccessibleQuickItem::characterCount()
const
842 QTextCursor cursor = QTextCursor(m_doc);
843 cursor.movePosition(QTextCursor::End);
844 return cursor.position();
847 if (role() == QAccessible::EditableText)
848 return text(QAccessible::Value).size();
850 return text(QAccessible::Name).size();
853int QAccessibleQuickItem::cursorPosition()
const
855 QVariant pos = item()->property(
"cursorPosition");
859void QAccessibleQuickItem::setCursorPosition(
int position)
861 item()->setProperty(
"cursorPosition", position);
864QString QAccessibleQuickItem::text(
int startOffset,
int endOffset)
const
867 QTextCursor cursor = QTextCursor(m_doc);
868 cursor.setPosition(startOffset);
869 cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
870 return cursor.selectedText();
873 if (role() == QAccessible::EditableText)
874 return text(QAccessible::Value).mid(startOffset, endOffset - startOffset);
876 return text(QAccessible::Name).mid(startOffset, endOffset - startOffset);
879QString QAccessibleQuickItem::textBeforeOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
880 int *startOffset,
int *endOffset)
const
882 Q_ASSERT(startOffset);
886 return qt_accTextBeforeOffsetHelper(*
this, QTextCursor(m_doc), offset, boundaryType, startOffset, endOffset);
888 return QAccessibleTextInterface::textBeforeOffset(offset, boundaryType, startOffset, endOffset);
892QString QAccessibleQuickItem::textAfterOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
893 int *startOffset,
int *endOffset)
const
895 Q_ASSERT(startOffset);
899 return qt_accTextAfterOffsetHelper(*
this, QTextCursor(m_doc), offset, boundaryType, startOffset, endOffset);
901 return QAccessibleTextInterface::textAfterOffset(offset, boundaryType, startOffset, endOffset);
905QString QAccessibleQuickItem::textAtOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
906 int *startOffset,
int *endOffset)
const
908 Q_ASSERT(startOffset);
912 return qt_accTextAtOffsetHelper(*
this, QTextCursor(m_doc), offset, boundaryType, startOffset, endOffset);
914 return QAccessibleTextInterface::textAtOffset(offset, boundaryType, startOffset, endOffset);
918void QAccessibleQuickItem::selection(
int selectionIndex,
int *startOffset,
int *endOffset)
const
920 if (selectionIndex == 0) {
921 *startOffset = item()->property(
"selectionStart").toInt();
922 *endOffset = item()->property(
"selectionEnd").toInt();
929int QAccessibleQuickItem::selectionCount()
const
931 if (item()->property(
"selectionStart").toInt() != item()->property(
"selectionEnd").toInt())
936void QAccessibleQuickItem::addSelection(
int startOffset,
int endOffset)
938 setSelection(0, startOffset, endOffset);
940void QAccessibleQuickItem::removeSelection(
int )
944void QAccessibleQuickItem::setSelection(
int ,
int ,
int )
949QList<QAccessible::Attribute> QAccessibleQuickItem::attributeKeys()
const
951 if (attributeValue(QAccessible::Attribute::Locale).isValid())
952 return { QAccessible::Attribute::Locale };
957QVariant QAccessibleQuickItem::attributeValue(QAccessible::Attribute key)
const
959 if (key == QAccessible::Attribute::Locale) {
960 QAccessibleInterface *windowIface = QAccessible::queryAccessibleInterface(window());
961 if (!windowIface || !windowIface->attributesInterface())
964 return windowIface->attributesInterface()->attributeValue(QAccessible::Attribute::Locale);