From 592729d00b1ee1279884feceff7070d14208a0ef Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sun, 14 Dec 2025 01:57:47 +0100 Subject: [PATCH] SliderSlider: Use SC_SliderGroove Fixes #1675 --- src/widgets/sliderslider.cpp | 44 ++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/widgets/sliderslider.cpp b/src/widgets/sliderslider.cpp index 33a7a3371..78a73940d 100644 --- a/src/widgets/sliderslider.cpp +++ b/src/widgets/sliderslider.cpp @@ -67,22 +67,36 @@ void SliderSlider::slideEvent(QMouseEvent *e) { QStyleOptionSlider option; initStyleOption(&option); - QRect sliderRect(style()->subControlRect(QStyle::CC_Slider, &option, QStyle::SC_SliderHandle, this)); + const QRect slider_groove = style()->subControlRect(QStyle::CC_Slider, &option, QStyle::SC_SliderGroove, this); + const QRect slider_handle = style()->subControlRect(QStyle::CC_Slider, &option, QStyle::SC_SliderHandle, this); + int pos = 0; + int span = 0; + bool upside_down = false; + if (orientation() == Qt::Horizontal) { + const int slider_length = slider_handle.width(); + const int slider_min = slider_groove.x(); + const int slider_max = slider_groove.right() - slider_length + 1; + if (QApplication::isRightToLeft()) { + pos = width() - (e->pos().x() - slider_length / 2); + span = width() + slider_length; + upside_down = true; + } + else { + pos = (e->pos().x() - slider_length / 2) - slider_min; + span = slider_max - slider_min; + upside_down = false; + } + } + else { + const int slider_length = slider_handle.height(); + const int slider_min = slider_groove.y(); + const int slider_max = slider_groove.bottom() - slider_length + 1; + pos = (e->pos().y() - slider_length / 2) - slider_min; + span = slider_max - slider_min; + upside_down = false; + } - QSlider::setValue( - orientation() == Qt::Horizontal - ? ((QApplication::layoutDirection() == Qt::RightToLeft) - ? QStyle::sliderValueFromPosition( - minimum(), maximum(), - width() - (e->pos().x() - sliderRect.width() / 2), - width() + sliderRect.width(), true) - : QStyle::sliderValueFromPosition( - minimum(), maximum(), - e->pos().x() - sliderRect.width() / 2, - width() - sliderRect.width())) - : QStyle::sliderValueFromPosition( - minimum(), maximum(), e->pos().y() - sliderRect.height() / 2, - height() - sliderRect.height())); + QSlider::setValue(QStyle::sliderValueFromPosition(minimum(), maximum(), pos, span, upside_down)); }