QWindowsTheme: honor dpr when requesting standard icons
The devicePixelRatio was not taken into account when a standard icon was requested from the windows qpa which resulted in blurry icons for a dpr != 1. Therefore pass the dpr-corrected size to QWindowsTheme::standardPixmap() and pass this size to SHDefExtractIcon() to get a correctly scaled icon. Pick-to: 6.6 Fixes: QTBUG-52622 Change-Id: Ia771dd2f93fa133cf2c4429ef59a9c5cb05ad047 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io> (cherry picked from commit 20cdc663b420a332d16f5f1ca82f352924cd7d1d) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
fd66400062
commit
76aab86de2
@ -943,15 +943,18 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &pixmapSiz
|
||||
}
|
||||
|
||||
if (stockId != SIID_INVALID) {
|
||||
QPixmap pixmap;
|
||||
SHSTOCKICONINFO iconInfo;
|
||||
memset(&iconInfo, 0, sizeof(iconInfo));
|
||||
iconInfo.cbSize = sizeof(iconInfo);
|
||||
stockFlags |= (pixmapSize.width() > 16 ? SHGFI_LARGEICON : SHGFI_SMALLICON);
|
||||
if (SHGetStockIconInfo(stockId, SHGFI_ICON | stockFlags, &iconInfo) == S_OK) {
|
||||
pixmap = qt_pixmapFromWinHICON(iconInfo.hIcon);
|
||||
DestroyIcon(iconInfo.hIcon);
|
||||
return pixmap;
|
||||
stockFlags |= SHGSI_ICONLOCATION;
|
||||
if (SHGetStockIconInfo(stockId, stockFlags, &iconInfo) == S_OK) {
|
||||
const auto iconSize = pixmapSize.width();
|
||||
HICON icon;
|
||||
if (SHDefExtractIcon(iconInfo.szPath, iconInfo.iIcon, 0, &icon, nullptr, iconSize) == S_OK) {
|
||||
QPixmap pixmap = qt_pixmapFromWinHICON(icon);
|
||||
DestroyIcon(icon);
|
||||
return pixmap;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5616,8 +5616,10 @@ QIcon QCommonStylePrivate::iconFromWindowsTheme(QCommonStyle::StandardPixmap sta
|
||||
case QStyle::SP_MessageBoxQuestion:
|
||||
if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
|
||||
QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardIcon);
|
||||
for (int size = 16 ; size <= 32 ; size += 16) {
|
||||
QPixmap pixmap = theme->standardPixmap(sp, QSizeF(size, size));
|
||||
const auto dpr = qt_getDevicePixelRatio(widget);
|
||||
for (const int size : {16, 32}) {
|
||||
QPixmap pixmap = theme->standardPixmap(sp, QSizeF(size, size) * dpr);
|
||||
pixmap.setDevicePixelRatio(dpr);
|
||||
icon.addPixmap(pixmap, QIcon::Normal);
|
||||
}
|
||||
}
|
||||
@ -5628,11 +5630,14 @@ QIcon QCommonStylePrivate::iconFromWindowsTheme(QCommonStyle::StandardPixmap sta
|
||||
QPlatformTheme::StandardPixmap spOff = static_cast<QPlatformTheme::StandardPixmap>(standardIcon);
|
||||
QPlatformTheme::StandardPixmap spOn = standardIcon == QStyle::SP_DirIcon ? QPlatformTheme::DirOpenIcon
|
||||
: QPlatformTheme::DirLinkOpenIcon;
|
||||
for (int size = 16 ; size <= 32 ; size += 16) {
|
||||
QSizeF pixSize(size, size);
|
||||
const auto dpr = qt_getDevicePixelRatio(widget);
|
||||
for (const int size : {16, 32}) {
|
||||
const QSizeF pixSize = QSizeF(size, size) * dpr;
|
||||
QPixmap pixmap = theme->standardPixmap(spOff, pixSize);
|
||||
pixmap.setDevicePixelRatio(dpr);
|
||||
icon.addPixmap(pixmap, QIcon::Normal, QIcon::Off);
|
||||
pixmap = theme->standardPixmap(spOn, pixSize);
|
||||
pixmap.setDevicePixelRatio(dpr);
|
||||
icon.addPixmap(pixmap, QIcon::Normal, QIcon::On);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user