From 07ff65b33d2993d458937e33153843f83b86378c Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sat, 19 Apr 2025 14:01:06 +0200 Subject: [PATCH] Windows11/VistaStyle: pass dpr to QIcon::pixmap() Pass the correct devicePixelRatio to QIcon::pixmap() to make sure the best pixmap is used for the current dpr. Change-Id: I70014b649457cee819228fa0ead7beb7de944471 Reviewed-by: Volker Hilsheimer Reviewed-by: Wladimir Leuschner (cherry picked from commit e34db561cfa61f409313c80311d9890d115c0d8e) Reviewed-by: Qt Cherry-pick Bot --- .../styles/modernwindows/qwindows11style.cpp | 8 ++++---- .../styles/modernwindows/qwindowsvistastyle.cpp | 17 ++++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp index 1a00599a8b5..b8c910d5749 100644 --- a/src/plugins/styles/modernwindows/qwindows11style.cpp +++ b/src/plugins/styles/modernwindows/qwindows11style.cpp @@ -665,11 +665,11 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt titlebar->icon.paint(painter, iconRect); } else { QStyleOption tool = *titlebar; - QPixmap pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget).pixmap(16, 16); - tool.rect = iconRect; - painter->save(); + const auto extent = proxy()->pixelMetric(PM_SmallIconSize, &tool, widget); + const auto dpr = QStyleHelper::getDpr(widget); + const auto icon = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget); + const auto pm = icon.pixmap(QSize(extent, extent), dpr); proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pm); - painter->restore(); } } } diff --git a/src/plugins/styles/modernwindows/qwindowsvistastyle.cpp b/src/plugins/styles/modernwindows/qwindowsvistastyle.cpp index 4a951da427a..5b7822b651d 100644 --- a/src/plugins/styles/modernwindows/qwindowsvistastyle.cpp +++ b/src/plugins/styles/modernwindows/qwindowsvistastyle.cpp @@ -2786,7 +2786,9 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption break; QPalette::ColorRole textRole = disabled ? QPalette::Text : QPalette::ButtonText; - QPixmap pix = mbi->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option, widget), QIcon::Normal); + const auto dpr = QStyleHelper::getDpr(widget); + const auto extent = proxy()->pixelMetric(PM_SmallIconSize, option, widget); + const auto pix = mbi->icon.pixmap(QSize(extent, extent), dpr, QIcon::Normal); int alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; if (!proxy()->styleHint(SH_UnderlineShortcut, mbi, widget)) @@ -3084,7 +3086,6 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption else stateId = CS_INACTIVE; - int titleHeight = rect.height() - 2; rect = rect.adjusted(-fw, -fw, fw, 0); QWindowsThemeData theme(widget, painter, themeNumber, 0, stateId); @@ -3101,7 +3102,9 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption QIcon ico = widget->windowIcon(); bool hasIcon = (ico.cacheKey() != QApplication::windowIcon().cacheKey()); if (hasIcon) { - QPixmap pxIco = ico.pixmap(titleHeight); + const auto titleHeight = rect.height() - 2; + const auto dpr = QStyleHelper::getDpr(widget); + const auto pxIco = ico.pixmap(QSize(titleHeight, titleHeight), dpr); if (!verticalTitleBar && dwOpt->direction == Qt::RightToLeft) painter->drawPixmap(rect.width() - titleHeight - pxIco.width(), rect.bottom() - titleHeight - 2, pxIco); else @@ -3681,11 +3684,11 @@ void QWindowsVistaStyle::drawComplexControl(ComplexControl control, const QStyle theme.partId = partId; theme.stateId = stateId; if (theme.size().isEmpty()) { - int iconSize = proxy()->pixelMetric(PM_SmallIconSize, tb, widget); - QPixmap pm = proxy()->standardIcon(SP_TitleBarMenuButton, tb, widget).pixmap(iconSize, iconSize); - painter->save(); + const auto extent = proxy()->pixelMetric(PM_SmallIconSize, tb, widget); + const auto dpr = QStyleHelper::getDpr(widget); + const auto icon = proxy()->standardIcon(SP_TitleBarMenuButton, tb, widget); + const auto pm = icon.pixmap(QSize(extent, extent), dpr); drawItemPixmap(painter, theme.rect, Qt::AlignCenter, pm); - painter->restore(); } else { d->drawBackground(theme); }