From 121c923d46a1ccfc10e3d0094b1db9510fd08166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Arve=20S=C3=A6ther?= Date: Thu, 10 Dec 2020 22:57:31 +0100 Subject: Do not crash because of missing context on the indicator buttons This now follows the same pattern as QQuickSpinBox does it for it's own indicator buttons. a11y::ScrollBar crashed because of this Change-Id: I5669fa2bf130b37ad46573aae5c6bebd8e0d0434 Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickscrollbar.cpp | 28 ++++++++++++++++++++++++---- src/quicktemplates2/qquickscrollbar_p.h | 3 +++ 2 files changed, 27 insertions(+), 4 deletions(-) (limited to 'src/quicktemplates2') diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index 4c89b330..cc338b65 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -388,6 +388,9 @@ void QQuickScrollBarPrivate::updateHover(const QPointF &pos, std::optional QQuickScrollBar::QQuickScrollBar(QQuickItem *parent) : QQuickControl(*(new QQuickScrollBarPrivate), parent) { + Q_D(QQuickScrollBar); + d->decreaseVisual = new QQuickIndicatorButton(this); + d->increaseVisual = new QQuickIndicatorButton(this); setKeepMouseGrab(true); setAcceptedMouseButtons(Qt::LeftButton); #if QT_CONFIG(quicktemplates2_multitouch) @@ -771,16 +774,12 @@ qreal QQuickScrollBar::visualPosition() const QQuickIndicatorButton *QQuickScrollBar::decreaseVisual() { Q_D(QQuickScrollBar); - if (!d->decreaseVisual) - d->decreaseVisual = new QQuickIndicatorButton(this); return d->decreaseVisual; } QQuickIndicatorButton *QQuickScrollBar::increaseVisual() { Q_D(QQuickScrollBar); - if (!d->increaseVisual) - d->increaseVisual = new QQuickIndicatorButton(this); return d->increaseVisual; } @@ -855,6 +854,27 @@ void QQuickScrollBar::hoverLeaveEvent(QHoverEvent *event) d->updateHover(QPoint(), false); //position is not needed when we force it to unhover } +void QQuickScrollBar::classBegin() +{ + Q_D(QQuickScrollBar); + QQuickControl::classBegin(); + + QQmlContext *context = qmlContext(this); + if (context) { + QQmlEngine::setContextForObject(d->decreaseVisual, context); + QQmlEngine::setContextForObject(d->increaseVisual, context); + } +} + +void QQuickScrollBar::componentComplete() +{ + Q_D(QQuickScrollBar); + QQuickIndicatorButtonPrivate::get(d->decreaseVisual)->executeIndicator(true); + QQuickIndicatorButtonPrivate::get(d->increaseVisual)->executeIndicator(true); + + QQuickControl::componentComplete(); +} + #if QT_CONFIG(accessibility) void QQuickScrollBar::accessibilityActiveChanged(bool active) { diff --git a/src/quicktemplates2/qquickscrollbar_p.h b/src/quicktemplates2/qquickscrollbar_p.h index b35575b9..b7de290b 100644 --- a/src/quicktemplates2/qquickscrollbar_p.h +++ b/src/quicktemplates2/qquickscrollbar_p.h @@ -174,6 +174,9 @@ protected: void hoverLeaveEvent(QHoverEvent *event) override; #endif + void classBegin() override; + void componentComplete() override; + #if QT_CONFIG(accessibility) void accessibilityActiveChanged(bool active) override; QAccessible::Role accessibleRole() const override; -- cgit v1.2.3