diff --git src/quicktemplates2/qquickrangeslider.cpp src/quicktemplates2/qquickrangeslider.cpp index 9ad12102e..a59ee5a8c 100644 --- src/quicktemplates2/qquickrangeslider.cpp +++ src/quicktemplates2/qquickrangeslider.cpp @@ -532,19 +532,21 @@ void QQuickRangeSliderPrivate::handleMove(const QPointF &point) { Q_Q(QQuickRangeSlider); QQuickControlPrivate::handleMove(point); - QQuickRangeSliderNode *pressedNode = QQuickRangeSliderPrivate::pressedNode(touchId); - if (pressedNode) { - const qreal oldPos = pressedNode->position(); - qreal pos = positionAt(q, pressedNode->handle(), point); - if (snapMode == QQuickRangeSlider::SnapAlways) - pos = snapPosition(q, pos); - if (live) - pressedNode->setValue(valueAt(q, pos)); - else - QQuickRangeSliderNodePrivate::get(pressedNode)->setPosition(pos); + if (q->keepMouseGrab() || q->keepTouchGrab()) { + QQuickRangeSliderNode *pressedNode = QQuickRangeSliderPrivate::pressedNode(touchId); + if (pressedNode) { + const qreal oldPos = pressedNode->position(); + qreal pos = positionAt(q, pressedNode->handle(), point); + if (snapMode == QQuickRangeSlider::SnapAlways) + pos = snapPosition(q, pos); + if (live) + pressedNode->setValue(valueAt(q, pos)); + else + QQuickRangeSliderNodePrivate::get(pressedNode)->setPosition(pos); - if (!qFuzzyCompare(pressedNode->position(), oldPos)) - emit pressedNode->moved(); + if (!qFuzzyCompare(pressedNode->position(), oldPos)) + emit pressedNode->moved(); + } } } @@ -559,22 +561,21 @@ void QQuickRangeSliderPrivate::handleRelease(const QPointF &point) return; QQuickRangeSliderNodePrivate *pressedNodePrivate = QQuickRangeSliderNodePrivate::get(pressedNode); - if (q->keepMouseGrab() || q->keepTouchGrab()) { - const qreal oldPos = pressedNode->position(); - qreal pos = positionAt(q, pressedNode->handle(), point); - if (snapMode != QQuickRangeSlider::NoSnap) - pos = snapPosition(q, pos); - qreal val = valueAt(q, pos); - if (!qFuzzyCompare(val, pressedNode->value())) - pressedNode->setValue(val); - else if (snapMode != QQuickRangeSlider::NoSnap) - pressedNodePrivate->setPosition(pos); - q->setKeepMouseGrab(false); - q->setKeepTouchGrab(false); - - if (!qFuzzyCompare(pressedNode->position(), oldPos)) - emit pressedNode->moved(); - } + const qreal oldPos = pressedNode->position(); + qreal pos = positionAt(q, pressedNode->handle(), point); + if (snapMode != QQuickRangeSlider::NoSnap) + pos = snapPosition(q, pos); + qreal val = valueAt(q, pos); + if (!qFuzzyCompare(val, pressedNode->value())) + pressedNode->setValue(val); + else if (snapMode != QQuickRangeSlider::NoSnap) + pressedNodePrivate->setPosition(pos); + q->setKeepMouseGrab(false); + q->setKeepTouchGrab(false); + + if (!qFuzzyCompare(pressedNode->position(), oldPos)) + emit pressedNode->moved(); + pressedNode->setPressed(false); pressedNodePrivate->touchId = -1; } @@ -1177,12 +1178,17 @@ void QQuickRangeSlider::keyReleaseEvent(QKeyEvent *event) d->second->setPressed(false); } -void QQuickRangeSlider::mousePressEvent(QMouseEvent *event) +void QQuickRangeSlider::mouseMoveEvent(QMouseEvent *event) { Q_D(QQuickRangeSlider); - QQuickControl::mousePressEvent(event); + if (!keepMouseGrab()) { + const QPointF movePoint = event->localPos(); + if (d->orientation == Qt::Horizontal) + setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(movePoint.x() - d->pressPoint.x(), Qt::XAxis, event)); + else + setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(movePoint.y() - d->pressPoint.y(), Qt::YAxis, event)); + } d->handleMove(event->localPos()); - setKeepMouseGrab(true); } #if QT_CONFIG(quicktemplates2_multitouch) diff --git src/quicktemplates2/qquickrangeslider_p.h src/quicktemplates2/qquickrangeslider_p.h index a42245a12..5ec10b120 100644 --- src/quicktemplates2/qquickrangeslider_p.h +++ src/quicktemplates2/qquickrangeslider_p.h @@ -136,7 +136,7 @@ protected: void hoverLeaveEvent(QHoverEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; #if QT_CONFIG(quicktemplates2_multitouch) void touchEvent(QTouchEvent *event) override; #endif diff --git src/quicktemplates2/qquickslider.cpp src/quicktemplates2/qquickslider.cpp index f4a459faa..bb6e373bb 100644 --- src/quicktemplates2/qquickslider.cpp +++ src/quicktemplates2/qquickslider.cpp @@ -191,16 +191,18 @@ void QQuickSliderPrivate::handleMove(const QPointF &point) { Q_Q(QQuickSlider); QQuickControlPrivate::handleMove(point); - const qreal oldPos = position; - qreal pos = positionAt(point); - if (snapMode == QQuickSlider::SnapAlways) - pos = snapPosition(pos); - if (live) - q->setValue(q->valueAt(pos)); - else - setPosition(pos); - if (!qFuzzyCompare(pos, oldPos)) - emit q->moved(); + if (q->keepMouseGrab() || q->keepTouchGrab()) { + const qreal oldPos = position; + qreal pos = positionAt(point); + if (snapMode == QQuickSlider::SnapAlways) + pos = snapPosition(pos); + if (live) + q->setValue(q->valueAt(pos)); + else + setPosition(pos); + if (!qFuzzyCompare(pos, oldPos)) + emit q->moved(); + } } void QQuickSliderPrivate::handleRelease(const QPointF &point) @@ -786,12 +788,17 @@ void QQuickSlider::keyReleaseEvent(QKeyEvent *event) setPressed(false); } -void QQuickSlider::mousePressEvent(QMouseEvent *event) +void QQuickSlider::mouseMoveEvent(QMouseEvent *event) { Q_D(QQuickSlider); - QQuickControl::mousePressEvent(event); + if (!keepMouseGrab()) { + const QPointF movePoint = event->localPos(); + if (d->orientation == Qt::Horizontal) + setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(movePoint.x() - d->pressPoint.x(), Qt::XAxis, event)); + else + setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(movePoint.y() - d->pressPoint.y(), Qt::YAxis, event)); + } d->handleMove(event->localPos()); - setKeepMouseGrab(true); } #if QT_CONFIG(quicktemplates2_multitouch) diff --git src/quicktemplates2/qquickslider_p.h src/quicktemplates2/qquickslider_p.h index c65733dc9..45364654c 100644 --- src/quicktemplates2/qquickslider_p.h +++ src/quicktemplates2/qquickslider_p.h @@ -160,7 +160,7 @@ Q_SIGNALS: protected: void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; #if QT_CONFIG(quicktemplates2_multitouch) void touchEvent(QTouchEvent *event) override; #endif