diff --git a/ui/accessible/ui_accessible_item.cpp b/ui/accessible/ui_accessible_item.cpp index 32fa54d9..8ad1bf32 100644 --- a/ui/accessible/ui_accessible_item.cpp +++ b/ui/accessible/ui_accessible_item.cpp @@ -91,7 +91,10 @@ QWindow *Item::window() const { QAccessible::Role Item::role() const { const auto parent = _parent.get(); - return parent + const auto index = parent ? currentIndex() : -1; + return (index >= 0) + ? parent->accessibilityChildRoleAt(index) + : parent ? parent->accessibilityChildRole() : QAccessible::Role(); } diff --git a/ui/rp_widget.cpp b/ui/rp_widget.cpp index 3fec5525..2b21e3b3 100644 --- a/ui/rp_widget.cpp +++ b/ui/rp_widget.cpp @@ -402,6 +402,10 @@ QAccessible::Role RpWidget::accessibilityChildRole() const { return QAccessible::Role::NoRole; } +QAccessible::Role RpWidget::accessibilityChildRoleAt(int index) const { + return accessibilityChildRole(); +} + QString RpWidget::accessibilityChildName(int index) const { return QString(); } diff --git a/ui/rp_widget.h b/ui/rp_widget.h index 1d10351e..172b565f 100644 --- a/ui/rp_widget.h +++ b/ui/rp_widget.h @@ -458,6 +458,13 @@ class RpWidget : public RpWidgetBase { [[nodiscard]] virtual QAccessible::State accessibilityChildState(int index) const; void accessibilityChildStateChanged(int index, AccessibilityState changes); [[nodiscard]] virtual QAccessible::Role accessibilityChildRole() const; + + // The role of one child where it differs from the list-wide one above: + // a divider row between the items of a list is a Separator, not one + // more item. Defaults to accessibilityChildRole(). + [[nodiscard]] virtual QAccessible::Role accessibilityChildRoleAt( + int index) const; + [[nodiscard]] virtual QRect accessibilityChildRect(int index) const; [[nodiscard]] virtual int accessibilityChildColumnCount(int row) const; [[nodiscard]] virtual QAccessible::Role accessibilityChildSubItemRole() const;