7#include <QtGui/qtextdocument.h>
9#include "QtQuick/private/qquickitem_p.h"
10#include "QtQuick/private/qquicktext_p.h"
11#include <private/qquicktext_p_p.h>
13#include "QtQuick/private/qquicktextinput_p.h"
14#include "QtQuick/private/qquickaccessibleattached_p.h"
15#include "QtQuick/qquicktextdocument.h"
16#include "QtQuick/qquickrendercontrol.h"
19#if QT_CONFIG(accessibility)
21class QAccessibleHyperlink :
public QAccessibleInterface,
public QAccessibleHyperlinkInterface {
23 QAccessibleHyperlink(QQuickItem *parentTextItem,
int linkIndex);
26 bool isValid()
const override;
27 QObject *object()
const override;
28 QWindow *window()
const override;
31 QAccessibleInterface *parent()
const override;
32 QAccessibleInterface *child(
int index)
const override;
33 int childCount()
const override;
34 int indexOfChild(
const QAccessibleInterface *iface)
const override;
35 QAccessibleInterface *childAt(
int x,
int y)
const override;
38 QString text(QAccessible::Text)
const override;
39 void setText(QAccessible::Text,
const QString &text) override;
40 QRect rect()
const override;
41 QAccessible::Role role()
const override;
42 QAccessible::State state()
const override;
44 void *interface_cast(QAccessible::InterfaceType t) override;
47 QString anchor()
const override
49 const QVector<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
50 if (linkIndex < links.size())
51 return links.at(linkIndex).m_anchor;
55 QString anchorTarget()
const override
57 const QVector<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
58 if (linkIndex < links.size())
59 return links.at(linkIndex).m_anchorTarget;
63 int startIndex()
const override
65 const QVector<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
66 if (linkIndex < links.size())
67 return links.at(linkIndex).m_startIndex;
71 int endIndex()
const override
73 const QVector<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
74 if (linkIndex < links.size())
75 return links.at(linkIndex).m_endIndex;
80 QQuickText *textItem()
const {
return qobject_cast<QQuickText*>(parentTextItem); }
81 QQuickItem *parentTextItem;
84 friend class QAccessibleQuickItem;
88QAccessibleHyperlink::QAccessibleHyperlink(QQuickItem *parentTextItem,
int linkIndex)
89 : parentTextItem(parentTextItem),
95bool QAccessibleHyperlink::isValid()
const
101QObject *QAccessibleHyperlink::object()
const
107QWindow *QAccessibleHyperlink::window()
const
109 return textItem()->window();
114QRect QAccessibleHyperlink::rect()
const
116 const QVector<QQuickTextPrivate::LinkDesc> links = QQuickTextPrivate::get(textItem())->getLinks();
117 if (linkIndex < links.size()) {
118 const QPoint tl = itemScreenRect(textItem()).topLeft();
119 return links.at(linkIndex).rect.translated(tl);
125QAccessibleInterface *QAccessibleHyperlink::childAt(
int,
int)
const
131QAccessibleInterface *QAccessibleHyperlink::parent()
const
133 return QAccessible::queryAccessibleInterface(textItem());
137QAccessibleInterface *QAccessibleHyperlink::child(
int)
const
143int QAccessibleHyperlink::childCount()
const
149int QAccessibleHyperlink::indexOfChild(
const QAccessibleInterface *)
const
155QAccessible::State QAccessibleHyperlink::state()
const
157 QAccessible::State s;
160 s.selectableText =
true;
166QAccessible::Role QAccessibleHyperlink::role()
const
168 return QAccessible::Link;
172QString QAccessibleHyperlink::text(QAccessible::Text t)
const
182 if (t == QAccessible::Name)
184 if (t == QAccessible::Value)
185 return anchorTarget();
190void QAccessibleHyperlink::setText(QAccessible::Text,
const QString &)
196void *QAccessibleHyperlink::interface_cast(QAccessible::InterfaceType t)
198 if (t == QAccessible::HyperlinkInterface)
199 return static_cast<QAccessibleHyperlinkInterface*>(
this);
205
206
207
208
209QAccessibleQuickItem::QAccessibleQuickItem(QQuickItem *item)
210 : QAccessibleObject(item), m_doc(textDocument())
214bool QAccessibleQuickItem::isValid()
const
216 return item() && !QQuickItemPrivate::get(item())->inDestructor;
220QWindow *QAccessibleQuickItem::window()
const
222 QQuickWindow *window = item()->window();
227 if (window && !window->handle()) {
228 if (QQuickRenderControl *renderControl = QQuickWindowPrivate::get(window)->renderControl) {
229 if (QWindow *renderWindow = renderControl->renderWindow(
nullptr))
237int QAccessibleQuickItem::childCount()
const
241 if (QQuickText *textItem = qobject_cast<QQuickText*>(item())) {
242 cc = QQuickTextPrivate::get(textItem)->getLinks().size();
244 cc += childItems().size();
248QRect QAccessibleQuickItem::rect()
const
250 const QRect r = itemScreenRect(item());
254QRect QAccessibleQuickItem::viewRect()
const
257 if (!item()->window()) {
261 QQuickWindow *window = item()->window();
262 QPoint screenPos = window->mapToGlobal(QPoint(0,0));
263 return QRect(screenPos, window->size());
267bool QAccessibleQuickItem::clipsChildren()
const
269 return static_cast<QQuickItem *>(item())->clip();
272QAccessibleInterface *QAccessibleQuickItem::childAt(
int x,
int y)
const
274 if (item()->clip()) {
275 if (!rect().contains(x, y))
280 if (QQuickText *textItem = qobject_cast<QQuickText*>(item())) {
281 const auto hyperLinkChildCount = QQuickTextPrivate::get(textItem)->getLinks().size();
282 for (
auto i = 0; i < hyperLinkChildCount; i++) {
283 QAccessibleInterface *iface = child(i);
284 if (iface->rect().contains(x,y)) {
291 const QList<QQuickItem*> kids = accessibleUnignoredChildren(item(),
true);
292 for (
int i = kids.size() - 1; i >= 0; --i) {
293 QAccessibleInterface *childIface = QAccessible::queryAccessibleInterface(kids.at(i));
294 if (QAccessibleInterface *childChild = childIface->childAt(x, y))
296 if (childIface && !childIface->state().invisible) {
297 if (childIface->rect().contains(x, y))
305QAccessibleInterface *QAccessibleQuickItem::parent()
const
307 QQuickItem *parent = item()->parentItem();
308 QQuickWindow *itemWindow = item()->window();
309 QQuickItem *ci = itemWindow ? itemWindow->contentItem() :
nullptr;
310 while (parent && !QQuickItemPrivate::get(parent)->isAccessible && parent != ci)
311 parent = parent->parentItem();
315 if (itemWindow && !itemWindow->handle()) {
323 const auto parentWidgetProp = itemWindow->property(
"_q_parentWidget");
324 if (parentWidgetProp.isValid()) {
325 if (QObject *parentWidget = parentWidgetProp.value<QObject *>())
326 return QAccessible::queryAccessibleInterface(parentWidget);
330 return QAccessible::queryAccessibleInterface(window());
332 while (parent && !parent->d_func()->isAccessible)
333 parent = parent->parentItem();
334 return QAccessible::queryAccessibleInterface(parent);
340QAccessibleInterface *QAccessibleQuickItem::child(
int index)
const
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
367 if (QQuickText *textItem = qobject_cast<QQuickText*>(item())) {
368 const int hyperLinkChildCount = QQuickTextPrivate::get(textItem)->getLinks().size();
369 if (index < hyperLinkChildCount) {
370 auto it = m_childToId.constFind(index);
371 if (it != m_childToId.constEnd())
372 return QAccessible::accessibleInterface(it.value());
374 QAccessibleHyperlink *iface =
new QAccessibleHyperlink(item(), index);
375 QAccessible::Id id = QAccessible::registerAccessibleInterface(iface);
376 m_childToId.insert(index, id);
379 index -= hyperLinkChildCount;
382 QList<QQuickItem *> children = childItems();
383 if (index < children.size()) {
384 QQuickItem *child = children.at(index);
385 return QAccessible::queryAccessibleInterface(child);
390int QAccessibleQuickItem::indexOfChild(
const QAccessibleInterface *iface)
const
392 int hyperLinkChildCount = 0;
393 if (QQuickText *textItem = qobject_cast<QQuickText*>(item())) {
394 hyperLinkChildCount = QQuickTextPrivate::get(textItem)->getLinks().size();
395 if (QAccessibleHyperlinkInterface *hyperLinkIface =
const_cast<QAccessibleInterface *>(iface)->hyperlinkInterface()) {
398 QAccessibleHyperlink *hyperLink =
static_cast<QAccessibleHyperlink*>(hyperLinkIface);
399 if (hyperLink->textItem() ==
static_cast<QQuickText*>(item())) {
400 return hyperLink->linkIndex;
404 QList<QQuickItem*> kids = childItems();
405 int idx = kids.indexOf(
static_cast<QQuickItem*>(iface->object()));
407 idx += hyperLinkChildCount;
411static void unignoredChildren(QQuickItem *item, QList<QQuickItem *> *items,
bool paintOrder)
413 const QList<QQuickItem*> childItems = paintOrder ? QQuickItemPrivate::get(item)->paintOrderChildItems()
414 : item->childItems();
415 for (QQuickItem *child : childItems) {
416 if (QQuickItemPrivate::get(child)->isAccessible) {
417 items->append(child);
419 unignoredChildren(child, items, paintOrder);
424QList<QQuickItem *> accessibleUnignoredChildren(QQuickItem *item,
bool paintOrder)
426 QList<QQuickItem *> items;
427 unignoredChildren(item, &items, paintOrder);
431QList<QQuickItem *> QAccessibleQuickItem::childItems()
const
433 return accessibleUnignoredChildren(item());
436static bool isTextRole(QAccessible::Role role)
438 return role == QAccessible::EditableText || role == QAccessible::StaticText;
441QAccessible::State QAccessibleQuickItem::state()
const
443 QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(item());
445 return QAccessible::State();
447 QAccessible::State state = attached->state();
449 QRect viewRect_ = viewRect();
450 QRect itemRect = rect();
452 if (viewRect_.isNull() || itemRect.isNull() || !window() || !window()->isVisible() ||!item()->isVisible() || qFuzzyIsNull(item()->opacity()))
453 state.invisible =
true;
454 if (!viewRect_.intersects(itemRect))
455 state.offscreen =
true;
456 if ((role() == QAccessible::CheckBox || role() == QAccessible::RadioButton) && object()->property(
"checked").toBool())
457 state.checked =
true;
458 if (item()->activeFocusOnTab() || isTextRole(role()))
459 state.focusable =
true;
460 if (item()->hasActiveFocus())
461 state.focused =
true;
462 if (role() == QAccessible::EditableText)
463 if (
auto ti = qobject_cast<QQuickTextInput *>(item()))
464 state.passwordEdit = ti->echoMode() != QQuickTextInput::Normal;
465 if (!item()->isEnabled()) {
466 state.focusable =
false;
467 state.disabled =
true;
472QList<std::pair<QAccessibleInterface *, QAccessible::Relation>>
473QAccessibleQuickItem::relations(QAccessible::Relation match)
const
475 QList<std::pair<QAccessibleInterface *, QAccessible::Relation>> rels =
476 QAccessibleObject::relations(match);
477 if (QQuickAccessibleAttached *attached = QQuickAccessibleAttached::attachedProperties(item())) {
478 if (match & QAccessible::Labelled) {
479 if (
auto *labelFor = attached->labelFor()) {
480 rels.append({QAccessible::queryAccessibleInterface(labelFor),
481 QAccessible::Labelled});
485 if (match & QAccessible::Label) {
486 if (
auto *labelledBy = attached->labelledBy()) {
487 rels.append({QAccessible::queryAccessibleInterface(labelledBy),
488 QAccessible::Label});
495QAccessible::Role QAccessibleQuickItem::role()
const
501 QAccessible::Role role = QAccessible::NoRole;
503 role = QQuickItemPrivate::get(item())->effectiveAccessibleRole();
504 if (role == QAccessible::NoRole) {
505 if (qobject_cast<QQuickText*>(
const_cast<QQuickItem *>(item())))
506 role = QAccessible::StaticText;
507 else if (qobject_cast<QQuickTextInput*>(
const_cast<QQuickItem *>(item())))
508 role = QAccessible::EditableText;
510 role = QAccessible::Client;
516bool QAccessibleQuickItem::isAccessible()
const
518 return item()->d_func()->isAccessible;
521QStringList QAccessibleQuickItem::actionNames()
const
525 case QAccessible::Link:
526 case QAccessible::PushButton:
527 case QAccessible::MenuItem:
528 actions << QAccessibleActionInterface::pressAction();
530 case QAccessible::RadioButton:
531 case QAccessible::CheckBox:
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 QVariant checked = object()->property(
"checked");
582 if (checked.isValid()) {
583 if (actionName == QAccessibleActionInterface::toggleAction() ||
584 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));
632QStringList QAccessibleQuickItem::keyBindingsForAction(
const QString &actionName)
const
634 Q_UNUSED(actionName);
635 return QStringList();
638QString QAccessibleQuickItem::text(QAccessible::Text textType)
const
642 case QAccessible::Name: {
643 QVariant accessibleName = QQuickAccessibleAttached::property(object(),
"name");
644 if (!accessibleName.isNull())
645 return accessibleName.toString();
647 case QAccessible::Description: {
648 QVariant accessibleDecription = QQuickAccessibleAttached::property(object(),
"description");
649 if (!accessibleDecription.isNull())
650 return accessibleDecription.toString();
652 case QAccessible::Identifier: {
653 QVariant accessibleIdentifier = QQuickAccessibleAttached::property(object(),
"id");
654 if (!accessibleIdentifier.isNull())
655 return accessibleIdentifier.toString();
656 auto quickItem = item();
657 if (quickItem->isComponentComplete()) {
658 QQmlContext *context = qmlContext(quickItem);
660 const auto objectId = context->nameForObject(quickItem);
661 if (!objectId.isEmpty())
666#ifdef Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
667 case QAccessible::DebugDescription: {
669 debugString = QString::fromLatin1(object()->metaObject()->className()) + QLatin1Char(
' ');
670 debugString += isAccessible() ? QLatin1String(
"enabled") : QLatin1String(
"disabled");
674 case QAccessible::Value:
675 case QAccessible::Help:
676 case QAccessible::Accelerator:
682 if (role() == QAccessible::EditableText) {
683 if (textType == QAccessible::Value) {
684 if (
auto textInput = qobject_cast<QQuickTextInput *>(item()))
685 return textInput->displayText();
686 if (QTextDocument *doc = textDocument()) {
687 return doc->toPlainText();
689 QVariant text = object()->property(
"text");
690 return text.toString();
697void QAccessibleQuickItem::setText(QAccessible::Text textType,
const QString &text)
699 if (role() != QAccessible::EditableText)
701 if (textType != QAccessible::Value)
704 if (QTextDocument *doc = textDocument()) {
705 doc->setPlainText(text);
708 auto textPropertyName =
"text";
709 if (object()->metaObject()->indexOfProperty(textPropertyName) >= 0)
710 object()->setProperty(textPropertyName, text);
713void *QAccessibleQuickItem::interface_cast(QAccessible::InterfaceType t)
715 const QAccessible::Role r = role();
717 case QAccessible::ActionInterface:
718 return static_cast<QAccessibleActionInterface*>(
this);
719 case QAccessible::ValueInterface:
720 if (r == QAccessible::Slider
721 || r == QAccessible::SpinBox
722 || r == QAccessible::Dial
723 || r == QAccessible::ScrollBar
724 || r == QAccessible::ProgressBar) {
725 return static_cast<QAccessibleValueInterface*>(
this);
728 case QAccessible::TextInterface:
729 if (r == QAccessible::EditableText
730 || r == QAccessible::StaticText
731 || r == QAccessible::Heading) {
732 return static_cast<QAccessibleTextInterface*>(
this);
739 return QAccessibleObject::interface_cast(t);
742QVariant QAccessibleQuickItem::currentValue()
const
744 return item()->property(
"value");
747void QAccessibleQuickItem::setCurrentValue(
const QVariant &value)
749 item()->setProperty(
"value", value);
752QVariant QAccessibleQuickItem::maximumValue()
const
754 const auto minimumValue = item()->property(
"minimumValue");
755 const auto maximumValue = item()->property(
"maximumValue");
756 const auto from = item()->property(
"from");
757 const auto to = item()->property(
"to");
759 if (minimumValue.isValid() && maximumValue.isValid())
762 if (from.isValid() && to.isValid())
768QVariant QAccessibleQuickItem::minimumValue()
const
770 const auto minimumValue = item()->property(
"minimumValue");
771 const auto maximumValue = item()->property(
"maximumValue");
772 const auto from = item()->property(
"from");
773 const auto to = item()->property(
"to");
775 if (minimumValue.isValid() && maximumValue.isValid())
778 if (from.isValid() && to.isValid())
784QVariant QAccessibleQuickItem::minimumStepSize()
const
786 return item()->property(
"stepSize");
790
791
792
793QRect itemScreenRect(QQuickItem *item)
797 if (!item->window() ||!item->isVisible() || qFuzzyIsNull(item->opacity())) {
801 QSizeF itemSize(item->width(), item->height());
804 if (itemSize.isEmpty()) {
805 itemSize = QSize(item->implicitWidth(), item->implicitHeight());
806 if (itemSize.isEmpty() && item->parentItem())
808 itemSize = QSize(item->parentItem()->width(), item->parentItem()->height());
811 QRectF sceneRect = item->mapRectToScene(QRectF(QPointF(0, 0), itemSize));
812 QPoint screenPos = item->window()->mapToGlobal(sceneRect.topLeft().toPoint());
813 QSize screenSize = sceneRect.size().toSize();
814 return QRect(screenPos, screenSize);
817QTextDocument *QAccessibleQuickItem::textDocument()
const
819 QVariant docVariant = item()->property(
"textDocument");
820 if (docVariant.canConvert<QQuickTextDocument*>()) {
821 QQuickTextDocument *qqdoc = docVariant.value<QQuickTextDocument*>();
822 return qqdoc->textDocument();
827int QAccessibleQuickItem::characterCount()
const
830 QTextCursor cursor = QTextCursor(m_doc);
831 cursor.movePosition(QTextCursor::End);
832 return cursor.position();
835 if (role() == QAccessible::EditableText)
836 return text(QAccessible::Value).size();
838 return text(QAccessible::Name).size();
841int QAccessibleQuickItem::cursorPosition()
const
843 QVariant pos = item()->property(
"cursorPosition");
847void QAccessibleQuickItem::setCursorPosition(
int position)
849 item()->setProperty(
"cursorPosition", position);
852QString QAccessibleQuickItem::text(
int startOffset,
int endOffset)
const
855 QTextCursor cursor = QTextCursor(m_doc);
856 cursor.setPosition(startOffset);
857 cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
858 return cursor.selectedText();
861 if (role() == QAccessible::EditableText)
862 return text(QAccessible::Value).mid(startOffset, endOffset - startOffset);
864 return text(QAccessible::Name).mid(startOffset, endOffset - startOffset);
867QString QAccessibleQuickItem::textBeforeOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
868 int *startOffset,
int *endOffset)
const
870 Q_ASSERT(startOffset);
874 QTextCursor cursor = QTextCursor(m_doc);
875 cursor.setPosition(offset);
876 std::pair<
int,
int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
877 cursor.setPosition(boundaries.first - 1);
878 boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
880 *startOffset = boundaries.first;
881 *endOffset = boundaries.second;
883 return text(boundaries.first, boundaries.second);
885 return QAccessibleTextInterface::textBeforeOffset(offset, boundaryType, startOffset, endOffset);
889QString QAccessibleQuickItem::textAfterOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
890 int *startOffset,
int *endOffset)
const
892 Q_ASSERT(startOffset);
896 QTextCursor cursor = QTextCursor(m_doc);
897 cursor.setPosition(offset);
898 std::pair<
int,
int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
899 cursor.setPosition(boundaries.second);
900 boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
902 *startOffset = boundaries.first;
903 *endOffset = boundaries.second;
905 return text(boundaries.first, boundaries.second);
907 return QAccessibleTextInterface::textAfterOffset(offset, boundaryType, startOffset, endOffset);
911QString QAccessibleQuickItem::textAtOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
912 int *startOffset,
int *endOffset)
const
914 Q_ASSERT(startOffset);
918 QTextCursor cursor = QTextCursor(m_doc);
919 cursor.setPosition(offset);
920 std::pair<
int,
int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
922 *startOffset = boundaries.first;
923 *endOffset = boundaries.second;
924 return text(boundaries.first, boundaries.second);
926 return QAccessibleTextInterface::textAtOffset(offset, boundaryType, startOffset, endOffset);
930void QAccessibleQuickItem::selection(
int selectionIndex,
int *startOffset,
int *endOffset)
const
932 if (selectionIndex == 0) {
933 *startOffset = item()->property(
"selectionStart").toInt();
934 *endOffset = item()->property(
"selectionEnd").toInt();
941int QAccessibleQuickItem::selectionCount()
const
943 if (item()->property(
"selectionStart").toInt() != item()->property(
"selectionEnd").toInt())
948void QAccessibleQuickItem::addSelection(
int ,
int )
952void QAccessibleQuickItem::removeSelection(
int )
956void QAccessibleQuickItem::setSelection(
int ,
int ,
int )