QFusionStyle: fix painting handle with tickmarks enabled

The handle was drawn outside of the widget's rect when tickmarks were
enabled (TicksAbove/TicksLeft).

Pick-to: 6.5
Fixes: QTBUG-83604
Change-Id: Iff3a1a330317576a759e3fd6795d0b4849e2044b
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
(cherry picked from commit 574692e5ac95e1f2061812a43f14d325c077b7c8)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit eb31663d038185661854b854e7765d2947121664)
This commit is contained in:
Christian Ehrlicher 2023-12-19 16:52:37 +01:00 committed by Qt Cherry-pick Bot
parent ed68a6ba41
commit 3011891fb4

View File

@ -3305,23 +3305,28 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom
int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget); int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget);
switch (subControl) { switch (subControl) {
case SC_SliderHandle: { case SC_SliderHandle: {
const bool bothTicks = (slider->tickPosition & QSlider::TicksBothSides) == QSlider::TicksBothSides;
if (slider->orientation == Qt::Horizontal) { if (slider->orientation == Qt::Horizontal) {
rect.setHeight(proxy()->pixelMetric(PM_SliderThickness, option)); rect.setHeight(proxy()->pixelMetric(PM_SliderThickness, option));
rect.setWidth(proxy()->pixelMetric(PM_SliderLength, option)); rect.setWidth(proxy()->pixelMetric(PM_SliderLength, option));
int centerY = slider->rect.center().y() - rect.height() / 2; int centerY = slider->rect.center().y() - rect.height() / 2;
if (!bothTicks) {
if (slider->tickPosition & QSlider::TicksAbove) if (slider->tickPosition & QSlider::TicksAbove)
centerY += tickSize; centerY += tickSize;
if (slider->tickPosition & QSlider::TicksBelow) if (slider->tickPosition & QSlider::TicksBelow)
centerY -= tickSize; centerY -= tickSize - 1;
}
rect.moveTop(centerY); rect.moveTop(centerY);
} else { } else {
rect.setWidth(proxy()->pixelMetric(PM_SliderThickness, option)); rect.setWidth(proxy()->pixelMetric(PM_SliderThickness, option));
rect.setHeight(proxy()->pixelMetric(PM_SliderLength, option)); rect.setHeight(proxy()->pixelMetric(PM_SliderLength, option));
int centerX = slider->rect.center().x() - rect.width() / 2; int centerX = slider->rect.center().x() - rect.width() / 2;
if (!bothTicks) {
if (slider->tickPosition & QSlider::TicksAbove) if (slider->tickPosition & QSlider::TicksAbove)
centerX += tickSize; centerX += tickSize;
if (slider->tickPosition & QSlider::TicksBelow) if (slider->tickPosition & QSlider::TicksBelow)
centerX -= tickSize; centerX -= tickSize - 1;
}
rect.moveLeft(centerX); rect.moveLeft(centerX);
} }
} }
@ -3329,18 +3334,23 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom
case SC_SliderGroove: { case SC_SliderGroove: {
QPoint grooveCenter = slider->rect.center(); QPoint grooveCenter = slider->rect.center();
const int grooveThickness = QStyleHelper::dpiScaled(7, option); const int grooveThickness = QStyleHelper::dpiScaled(7, option);
const bool bothTicks = (slider->tickPosition & QSlider::TicksBothSides) == QSlider::TicksBothSides;
if (slider->orientation == Qt::Horizontal) { if (slider->orientation == Qt::Horizontal) {
rect.setHeight(grooveThickness); rect.setHeight(grooveThickness);
if (!bothTicks) {
if (slider->tickPosition & QSlider::TicksAbove) if (slider->tickPosition & QSlider::TicksAbove)
grooveCenter.ry() += tickSize; grooveCenter.ry() += tickSize;
if (slider->tickPosition & QSlider::TicksBelow) if (slider->tickPosition & QSlider::TicksBelow)
grooveCenter.ry() -= tickSize; grooveCenter.ry() -= tickSize - 1;
}
} else { } else {
rect.setWidth(grooveThickness); rect.setWidth(grooveThickness);
if (!bothTicks) {
if (slider->tickPosition & QSlider::TicksAbove) if (slider->tickPosition & QSlider::TicksAbove)
grooveCenter.rx() += tickSize; grooveCenter.rx() += tickSize;
if (slider->tickPosition & QSlider::TicksBelow) if (slider->tickPosition & QSlider::TicksBelow)
grooveCenter.rx() -= tickSize; grooveCenter.rx() -= tickSize - 1;
}
} }
rect.moveCenter(grooveCenter); rect.moveCenter(grooveCenter);
break; break;