Use QHighDpiScaling when determining scale factor

The makes sure that the scale factor used by the style
is identical to the scale factor used by Qt Gui, by for
instance taking scale factor rounding into account.

Task-id: QTBUG-109715
Change-Id: Ia0354a7ce0f51eb9fd5f2591ee6c4057291943f3
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Morten Sørvig 2023-04-17 11:39:15 +02:00 committed by Morten Johan Sørvig
parent 020f03c47e
commit e3c9dce0b6

View File

@ -358,18 +358,15 @@ static QScreen *screenOf(const QWidget *w)
// and account for secondary screens with differing logical DPI.
qreal QWindowsStylePrivate::nativeMetricScaleFactor(const QWidget *widget)
{
const QPlatformScreen *screen = screenOf(widget)->handle();
const qreal scale = screen ? (screen->logicalDpi().first / screen->logicalBaseDpi().first)
: QWindowsStylePrivate::appDevicePixelRatio();
qreal scale = QHighDpiScaling::factor(screenOf(widget));
qreal result = qreal(1) / scale;
if (QGuiApplicationPrivate::screen_list.size() > 1) {
const QScreen *primaryScreen = QGuiApplication::primaryScreen();
const QScreen *screen = screenOf(widget);
if (screen != primaryScreen) {
const qreal primaryLogicalDpi = primaryScreen->handle()->logicalDpi().first;
const qreal logicalDpi = screen->handle()->logicalDpi().first;
if (!qFuzzyCompare(primaryLogicalDpi, logicalDpi))
result *= logicalDpi / primaryLogicalDpi;
qreal primaryScale = QHighDpiScaling::factor(primaryScreen);
if (!qFuzzyCompare(scale, primaryScale))
result *= scale / primaryScale;
}
}
return result;