From 8ca2d6ba09c4fad8a8d8adf97681c61d53c3a8b4 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Fri, 14 Apr 2023 16:13:06 +0200 Subject: [PATCH] CommonStyle/QSpinBox: fix rendering up/down symbols in high-dpi mode The previous patch for QTBUG-112019 could lead to an uneven length which in results in an incorrect center. Fix it by making sure that the length (and width) of the two rectangles are even so we always get a proper center without fiddling around with float values. Also honor PM_ButtonShiftHorizontal/Vertical now (was forgotten in the last patch). Pick-to: 6.5 Fixes: QTBUG-112019 Fixes: QTBUG-112861 Change-Id: Ifc19b863c761ae545208b996ba60d1f33bceb2b3 Reviewed-by: Volker Hilsheimer --- src/widgets/styles/qcommonstyle.cpp | 31 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index 28731aaca1..5736538443 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -501,23 +501,22 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q h = qRound(devicePixelRatio * h); p->translate(0.5, 0.5); } - // center and make sure horizontal and vertical line has equal length - if (w < h) { - y += (h - w) / 2; - h = w; - } else { - x += (w - h) / 2; - w = h; - } - - int offset = (opt->state & State_Sunken) ? 1 : 0; - int step = (w + 4) / 5; - p->fillRect(x + offset, y + offset + h / 2 - step / 2, w, step, - opt->palette.buttonText()); - if (pe == PE_IndicatorSpinPlus) { - p->fillRect(x + w / 2 - step / 2 + offset, y + offset, step, h, - opt->palette.buttonText()); + int len = std::min(w, h); + if (len & 1) + ++len; + int step = (len + 4) / 5; + if (step & 1) + ++step; + const int step2 = step / 2; + QPoint center(x + w / 2, y + h / 2); + if (opt->state & State_Sunken) { + center += QPoint(proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt), + proxy()->pixelMetric(PM_ButtonShiftVertical, opt)); } + p->translate(center); + p->fillRect(-len / 2, -step2, len, step, opt->palette.buttonText()); + if (pe == PE_IndicatorSpinPlus) + p->fillRect(-step2, -len / 2, step, len, opt->palette.buttonText()); p->restore(); break; } case PE_IndicatorSpinUp: