Avoid menu separators disappearing under fractional dpr scaling

An aliased line painted directly on top of the top edge of the clip
rect will work fine when there is no scaling, since the coordinates
will snap downwards. When a fractional scaling is applied however, the
main part of the line width will sometimes fall outside the clip rect,
and so the coordinates will snap it outside, and hence it will not be
painted.
Fix by shifting the y coordinate by .5, to place the center coordinate
of the line to the center of the intended pixel.

Fixes: QTBUG-88934
Task-number: QTBUG-96223
Pick-to: 6.3 6.2
Change-Id: I3ab042bc964eac6ce359d40428c4d79cde9cb78c
Reviewed-by: Nodir Temirkhodjaev <nodir.temir@gmail.com>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
bb10
Eirik Aavitsland 2022-05-31 09:50:45 +02:00
parent 567ffafe7f
commit b539dc118e
1 changed files with 3 additions and 2 deletions

View File

@ -1519,8 +1519,9 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio
}
painter->setPen(shadow.lighter(106));
const bool reverse = menuItem->direction == Qt::RightToLeft;
painter->drawLine(menuItem->rect.left() + margin + (reverse ? 0 : w), menuItem->rect.center().y(),
menuItem->rect.right() - margin - (reverse ? w : 0), menuItem->rect.center().y());
qreal y = menuItem->rect.center().y() + 0.5f;
painter->drawLine(QPointF(menuItem->rect.left() + margin + (reverse ? 0 : w), y),
QPointF(menuItem->rect.right() - margin - (reverse ? w : 0), y));
painter->restore();
break;
}