diff options
author | Christian Ehrlicher <[email protected]> | 2024-08-03 17:20:41 +0200 |
---|---|---|
committer | Christian Ehrlicher <[email protected]> | 2024-08-10 11:13:01 +0200 |
commit | 1910350482ff7ebe1eb727128900cefbb0f33f73 (patch) | |
tree | 7d74c0f8103ddc9586debd539a6e7dab0faa7e6a | |
parent | 64bb77ea8af403425347cb09028c35980a51138c (diff) |
Widgets/Styles: add helper function to get devicePixelRatio
Retrieving the devicePixelRatio is a common task and therefore small
helper functions were created in various files. Combine them in one
global (private) place and use it everywhere.
Pick-to: 6.8
Change-Id: I334aa1da359496dd2fe08394c1da3c916009d8f0
Reviewed-by: Axel Spoerl <[email protected]>
-rw-r--r-- | src/widgets/styles/qcommonstyle.cpp | 71 | ||||
-rw-r--r-- | src/widgets/styles/qdrawutil.cpp | 13 | ||||
-rw-r--r-- | src/widgets/styles/qfusionstyle.cpp | 22 | ||||
-rw-r--r-- | src/widgets/styles/qstyle_p.h | 2 | ||||
-rw-r--r-- | src/widgets/styles/qstylehelper_p.h | 19 | ||||
-rw-r--r-- | src/widgets/styles/qstylesheetstyle.cpp | 12 |
6 files changed, 73 insertions, 66 deletions
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index b82aa8a334b..ed891b47069 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -91,11 +91,6 @@ Q_STATIC_LOGGING_CATEGORY(lcCommonStyle, "qt.widgets.commonstyle"); using namespace Qt::StringLiterals; -static qreal qt_getDevicePixelRatio(const QWidget *widget) -{ - return widget ? widget->devicePixelRatio() : qApp->devicePixelRatio(); -} - struct QPainterStateSaver { QPainterStateSaver(QPainter *p, bool bSaveRestore = true) @@ -421,7 +416,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q mode = QIcon::Disabled; QIcon::State state = opt->state & State_Sunken ? QIcon::On : QIcon::Off; - QPixmap pixmap = d->tabBarcloseButtonIcon.pixmap(QSize(size, size), p->device()->devicePixelRatio(), mode, state); + QPixmap pixmap = d->tabBarcloseButtonIcon.pixmap(QSize(size, size), QStyleHelper::getDpr(p), mode, state); proxy()->drawItemPixmap(p, opt->rect, Qt::AlignCenter, pixmap); break; } @@ -513,7 +508,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q int w = br.width(); int h = br.height(); QPainterStateSaver pss(p); - const qreal devicePixelRatio = p->device()->devicePixelRatio(); + const qreal devicePixelRatio = QStyleHelper::getDpr(p); if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { const qreal inverseScale = qreal(1) / devicePixelRatio; p->scale(inverseScale, inverseScale); @@ -550,7 +545,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q int w = r.width(); int h = r.height(); QPainterStateSaver pss(p); - const qreal devicePixelRatio = p->device()->devicePixelRatio(); + const qreal devicePixelRatio = QStyleHelper::getDpr(p); if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { const qreal inverseScale = qreal(1) / devicePixelRatio; p->scale(inverseScale, inverseScale); @@ -755,7 +750,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q break; int size = qMin(r.height(), r.width()); QPixmap pixmap; - const qreal dpr = p->device()->devicePixelRatio(); + const qreal dpr = QStyleHelper::getDpr(p); const QString pixmapName = QStyleHelper::uniqueName("$qt_ia-"_L1 % QLatin1StringView(metaObject()->className()) % HexString<uint>(pe), @@ -1392,7 +1387,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, if (button->state & State_On) state = QIcon::On; - QPixmap pixmap = button->icon.pixmap(button->iconSize, p->device()->devicePixelRatio(), mode, state); + QPixmap pixmap = button->icon.pixmap(button->iconSize, QStyleHelper::getDpr(p), mode, state); int pixmapWidth = pixmap.width() / pixmap.devicePixelRatio(); int pixmapHeight = pixmap.height() / pixmap.devicePixelRatio(); int labelWidth = pixmapWidth; @@ -1466,7 +1461,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, QPixmap pix; QRect textRect = btn->rect; if (!btn->icon.isNull()) { - pix = btn->icon.pixmap(btn->iconSize, p->device()->devicePixelRatio(), btn->state & State_Enabled ? QIcon::Normal : QIcon::Disabled); + pix = btn->icon.pixmap(btn->iconSize, QStyleHelper::getDpr(p), btn->state & State_Enabled ? QIcon::Normal : QIcon::Disabled); proxy()->drawItemPixmap(p, btn->rect, alignment, pix); if (btn->direction == Qt::RightToLeft) textRect.setRight(textRect.right() - btn->iconSize.width() - 4); @@ -1508,7 +1503,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, if (!proxy()->styleHint(SH_UnderlineShortcut, mbi, widget)) alignment |= Qt::TextHideMnemonic; int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt, widget); - QPixmap pix = mbi->icon.pixmap(QSize(iconExtent, iconExtent), p->device()->devicePixelRatio(), (mbi->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); + QPixmap pix = mbi->icon.pixmap(QSize(iconExtent, iconExtent), QStyleHelper::getDpr(p), (mbi->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); if (!pix.isNull()) proxy()->drawItemPixmap(p,mbi->rect, alignment, pix); else @@ -1665,7 +1660,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, if (!header->icon.isNull()) { int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt, widget); QPixmap pixmap - = header->icon.pixmap(QSize(iconExtent, iconExtent), p->device()->devicePixelRatio(), (header->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); + = header->icon.pixmap(QSize(iconExtent, iconExtent), QStyleHelper::getDpr(p), (header->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); int pixw = pixmap.width() / pixmap.devicePixelRatio(); QRect aligned = alignedRect(header->direction, QFlag(header->iconAlignment), pixmap.size() / pixmap.devicePixelRatio(), rect); @@ -1736,7 +1731,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, mode = QIcon::Active; else mode = QIcon::Normal; - pm = toolbutton->icon.pixmap(toolbutton->rect.size().boundedTo(toolbutton->iconSize), p->device()->devicePixelRatio(), + pm = toolbutton->icon.pixmap(toolbutton->rect.size().boundedTo(toolbutton->iconSize), QStyleHelper::getDpr(p), mode, state); pmSize = pm.size() / pm.devicePixelRatio(); } @@ -1954,7 +1949,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, bool enabled = tb->state & State_Enabled; bool selected = tb->state & State_Selected; int iconExtent = proxy()->pixelMetric(QStyle::PM_SmallIconSize, tb, widget); - QPixmap pm = tb->icon.pixmap(QSize(iconExtent, iconExtent), p->device()->devicePixelRatio(), + QPixmap pm = tb->icon.pixmap(QSize(iconExtent, iconExtent), QStyleHelper::getDpr(p), enabled ? QIcon::Normal : QIcon::Disabled); QRect cr = subElementRect(QStyle::SE_ToolBoxTabContents, tb, widget); @@ -2031,7 +2026,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, tr = proxy()->subElementRect(SE_TabBarTabText, opt, widget); if (!tab->icon.isNull()) { - QPixmap tabIcon = tab->icon.pixmap(tab->iconSize, p->device()->devicePixelRatio(), + QPixmap tabIcon = tab->icon.pixmap(tab->iconSize, QStyleHelper::getDpr(p), (tab->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled, (tab->state & State_Selected) ? QIcon::On @@ -2232,7 +2227,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, if (!cb->currentIcon.isNull()) { QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal : QIcon::Disabled; - QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, p->device()->devicePixelRatio(), mode); + QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, QStyleHelper::getDpr(p), mode); QRect iconRect(editRect); iconRect.setWidth(cb->iconSize.width() + 4); iconRect = alignedRect(cb->direction, @@ -2539,7 +2534,7 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt, if (!btn->icon.isNull()) { iconRect = itemPixmapRect(cr, Qt::AlignAbsolute | Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, - btn->icon.pixmap(btn->iconSize, qt_getDevicePixelRatio(widget), QIcon::Normal)); + btn->icon.pixmap(btn->iconSize, QStyleHelper::getDpr(widget), QIcon::Normal)); if (!textRect.isEmpty()) textRect.translate(iconRect.right() + 4, 0); } @@ -2587,7 +2582,7 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt, } if (!btn->icon.isNull()) { iconRect = itemPixmapRect(cr, Qt::AlignAbsolute | Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, - btn->icon.pixmap(btn->iconSize, qt_getDevicePixelRatio(widget), QIcon::Normal)); + btn->icon.pixmap(btn->iconSize, QStyleHelper::getDpr(widget), QIcon::Normal)); if (!textRect.isEmpty()) textRect.translate(iconRect.right() + 4, 0); } @@ -3579,9 +3574,9 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl || qobject_cast<const QDockWidget *>(widget) #endif ) - pm = proxy()->standardIcon(SP_DockWidgetCloseButton, &tool, widget).pixmap(QSize(10, 10), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_DockWidgetCloseButton, &tool, widget).pixmap(QSize(10, 10), QStyleHelper::getDpr(p)); else - pm = proxy()->standardIcon(SP_TitleBarCloseButton, &tool, widget).pixmap(QSize(10, 10), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_TitleBarCloseButton, &tool, widget).pixmap(QSize(10, 10), QStyleHelper::getDpr(p)); tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); @@ -3599,7 +3594,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarMaxButton, widget); down = tb->activeSubControls & SC_TitleBarMaxButton && (opt->state & State_Sunken); - pm = proxy()->standardIcon(SP_TitleBarMaxButton, &tool, widget).pixmap(QSize(10, 10), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_TitleBarMaxButton, &tool, widget).pixmap(QSize(10, 10), QStyleHelper::getDpr(p)); tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); @@ -3616,7 +3611,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl && !(tb->titleBarState & Qt::WindowMinimized)) { ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarMinButton, widget); down = tb->activeSubControls & SC_TitleBarMinButton && (opt->state & State_Sunken); - pm = proxy()->standardIcon(SP_TitleBarMinButton, &tool, widget).pixmap(QSize(10, 10), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_TitleBarMinButton, &tool, widget).pixmap(QSize(10, 10), QStyleHelper::getDpr(p)); tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); @@ -3637,7 +3632,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl if (drawNormalButton) { ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarNormalButton, widget); down = tb->activeSubControls & SC_TitleBarNormalButton && (opt->state & State_Sunken); - pm = proxy()->standardIcon(SP_TitleBarNormalButton, &tool, widget).pixmap(QSize(10, 10), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_TitleBarNormalButton, &tool, widget).pixmap(QSize(10, 10), QStyleHelper::getDpr(p)); tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); @@ -3654,7 +3649,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl && !(tb->titleBarState & Qt::WindowMinimized)) { ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarShadeButton, widget); down = (tb->activeSubControls & SC_TitleBarShadeButton && (opt->state & State_Sunken)); - pm = proxy()->standardIcon(SP_TitleBarShadeButton, &tool, widget).pixmap(QSize(10, 10), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_TitleBarShadeButton, &tool, widget).pixmap(QSize(10, 10), QStyleHelper::getDpr(p)); tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); @@ -3671,7 +3666,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarUnshadeButton, widget); down = tb->activeSubControls & SC_TitleBarUnshadeButton && (opt->state & State_Sunken); - pm = proxy()->standardIcon(SP_TitleBarUnshadeButton, &tool, widget).pixmap(QSize(10, 10), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_TitleBarUnshadeButton, &tool, widget).pixmap(QSize(10, 10), QStyleHelper::getDpr(p)); tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); @@ -3686,7 +3681,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarContextHelpButton, widget); down = tb->activeSubControls & SC_TitleBarContextHelpButton && (opt->state & State_Sunken); - pm = proxy()->standardIcon(SP_TitleBarContextHelpButton, &tool, widget).pixmap(QSize(10, 10), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_TitleBarContextHelpButton, &tool, widget).pixmap(QSize(10, 10), QStyleHelper::getDpr(p)); tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); @@ -3702,7 +3697,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl tb->icon.paint(p, ir); } else { int iconSize = proxy()->pixelMetric(PM_SmallIconSize, tb, widget); - pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget).pixmap(QSize(iconSize, iconSize), p->device()->devicePixelRatio()); + pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget).pixmap(QSize(iconSize, iconSize), QStyleHelper::getDpr(p)); tool.rect = ir; QPainterStateSaver pss(p); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); @@ -3887,7 +3882,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl } btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiCloseButton, widget); proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p, widget); - QPixmap pm = proxy()->standardIcon(SP_TitleBarCloseButton).pixmap(buttonIconSize, p->device()->devicePixelRatio()); + QPixmap pm = proxy()->standardIcon(SP_TitleBarCloseButton).pixmap(buttonIconSize, QStyleHelper::getDpr(p)); proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm); } if (opt->subControls & QStyle::SC_MdiNormalButton) { @@ -3904,7 +3899,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl } btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiNormalButton, widget); proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p, widget); - QPixmap pm = proxy()->standardIcon(SP_TitleBarNormalButton).pixmap(buttonIconSize, p->device()->devicePixelRatio()); + QPixmap pm = proxy()->standardIcon(SP_TitleBarNormalButton).pixmap(buttonIconSize, QStyleHelper::getDpr(p)); proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm); } if (opt->subControls & QStyle::SC_MdiMinButton) { @@ -3921,7 +3916,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl } btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiMinButton, widget); proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p, widget); - QPixmap pm = proxy()->standardIcon(SP_TitleBarMinButton).pixmap(buttonIconSize, p->device()->devicePixelRatio()); + QPixmap pm = proxy()->standardIcon(SP_TitleBarMinButton).pixmap(buttonIconSize, QStyleHelper::getDpr(p)); proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm); } } @@ -5529,19 +5524,19 @@ QPixmap QCommonStyle::standardPixmap(StandardPixmap sp, const QStyleOption *opti icon = d->iconFromWindowsTheme(sp, option, widget); if (!icon.isNull()) - return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + return icon.pixmap(QSize(16, 16), QStyleHelper::getDpr(widget)); icon = d->iconFromApplicationTheme(sp, option, widget); if (!icon.isNull()) - return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + return icon.pixmap(QSize(16, 16), QStyleHelper::getDpr(widget)); icon = d->iconFromMacTheme(sp, option, widget); if (!icon.isNull()) - return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + return icon.pixmap(QSize(16, 16), QStyleHelper::getDpr(widget)); icon = d->iconFromResourceTheme(sp, option, widget); if (!icon.isNull()) - return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + return icon.pixmap(QSize(16, 16), QStyleHelper::getDpr(widget)); #ifndef QT_NO_IMAGEFORMAT_XPM switch (sp) { @@ -5616,7 +5611,7 @@ QIcon QCommonStylePrivate::iconFromWindowsTheme(QCommonStyle::StandardPixmap sta case QStyle::SP_MessageBoxQuestion: if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) { QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardIcon); - const auto dpr = qt_getDevicePixelRatio(widget); + const auto dpr = QStyleHelper::getDpr(widget); const QList<QSize> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<QSize>>(); for (const QSize &size : sizes) { QPixmap pixmap = theme->standardPixmap(sp, size * dpr); @@ -5631,7 +5626,7 @@ 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; - const auto dpr = qt_getDevicePixelRatio(widget); + const auto dpr = QStyleHelper::getDpr(widget); const QList<QSize> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<QSize>>(); for (const QSize &size : sizes) { const QSizeF pixSize = size * dpr; @@ -5763,7 +5758,7 @@ QIcon QCommonStylePrivate::iconFromApplicationTheme(QCommonStyle::StandardPixmap const QIcon baseIcon = iconFromApplicationTheme(si, option, widget); if (!linkIcon.isNull() || !baseIcon.isNull()) { const auto sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off); - const auto dpr = qt_getDevicePixelRatio(widget); + const auto dpr = QStyleHelper::getDpr(widget); for (const auto size : sizes) { QPixmap basePixmap = baseIcon.pixmap(size, dpr); QPixmap linkPixmap = linkIcon.pixmap(size / 2, dpr); diff --git a/src/widgets/styles/qdrawutil.cpp b/src/widgets/styles/qdrawutil.cpp index 5bdbdb11395..14fb3a41678 100644 --- a/src/widgets/styles/qdrawutil.cpp +++ b/src/widgets/styles/qdrawutil.cpp @@ -6,6 +6,7 @@ #include "qpixmapcache.h" #include "qpainter.h" #include "qpalette.h" +#include "qstylehelper_p.h" #include <private/qpaintengineex_p.h> #include <qvarlengtharray.h> #include <qmath.h> @@ -92,7 +93,7 @@ void qDrawShadeLine(QPainter *p, int x1, int y1, int x2, int y2, return; } PainterStateGuard painterGuard(p); - const qreal devicePixelRatio = p->device()->devicePixelRatio(); + const qreal devicePixelRatio = QStyleHelper::getDpr(p); if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { painterGuard.save(); const qreal inverseScale = qreal(1) / devicePixelRatio; @@ -223,7 +224,7 @@ void qDrawShadeRect(QPainter *p, int x, int y, int w, int h, } PainterStateGuard painterGuard(p); - const qreal devicePixelRatio = p->device()->devicePixelRatio(); + const qreal devicePixelRatio = QStyleHelper::getDpr(p); if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { painterGuard.save(); const qreal inverseScale = qreal(1) / devicePixelRatio; @@ -337,7 +338,7 @@ void qDrawShadePanel(QPainter *p, int x, int y, int w, int h, } PainterStateGuard painterGuard(p); - const qreal devicePixelRatio = p->device()->devicePixelRatio(); + const qreal devicePixelRatio = QStyleHelper::getDpr(p); bool isTranslated = false; if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { painterGuard.save(); @@ -433,7 +434,7 @@ static void qDrawWinShades(QPainter *p, return; PainterStateGuard painterGuard(p); - const qreal devicePixelRatio = p->device()->devicePixelRatio(); + const qreal devicePixelRatio = QStyleHelper::getDpr(p); bool isTranslated = false; if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { painterGuard.save(); @@ -581,7 +582,7 @@ void qDrawPlainRect(QPainter *p, int x, int y, int w, int h, const QColor &c, } PainterStateGuard painterGuard(p); - const qreal devicePixelRatio = p->device()->devicePixelRatio(); + const qreal devicePixelRatio = QStyleHelper::getDpr(p); if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { painterGuard.save(); const qreal inverseScale = qreal(1) / devicePixelRatio; @@ -648,7 +649,7 @@ void qDrawPlainRoundedRect(QPainter *p, int x, int y, int w, int h, } PainterStateGuard painterGuard(p); - const qreal devicePixelRatio = p->device()->devicePixelRatio(); + const qreal devicePixelRatio = QStyleHelper::getDpr(p); if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { painterGuard.save(); const qreal inverseScale = qreal(1) / devicePixelRatio; diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp index b8795379bdb..ca281ece401 100644 --- a/src/widgets/styles/qfusionstyle.cpp +++ b/src/widgets/styles/qfusionstyle.cpp @@ -145,7 +145,7 @@ static void qt_fusion_draw_arrow(Qt::ArrowType type, QPainter *painter, const QS return; const qreal dpi = QStyleHelper::dpi(option); - const qreal dpr = painter->device()->devicePixelRatio(); + const qreal dpr = QStyleHelper::getDpr(painter); const int arrowWidth = int(QStyleHelper::dpiScaled(14, dpi)); const int arrowHeight = int(QStyleHelper::dpiScaled(8, dpi)); @@ -890,7 +890,7 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio if (!cb->currentIcon.isNull()) { QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal : QIcon::Disabled; - QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, painter->device()->devicePixelRatio(), mode); + QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, QStyleHelper::getDpr(painter), mode); QRect iconRect(editRect); iconRect.setWidth(cb->iconSize.width() + 4); iconRect = alignedRect(cb->direction, @@ -1138,7 +1138,7 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) { const QStyleOptionHeaderV2 *headerV2 = qstyleoption_cast<const QStyleOptionHeaderV2 *>(option); const bool isSectionDragTarget = headerV2 ? headerV2->isSectionDragTarget : false; - const qreal dpr = painter->device()->devicePixelRatio(); + const qreal dpr = QStyleHelper::getDpr(painter); const QString pixmapName = QStyleHelper::uniqueName("headersection-"_L1 % HexString(header->position) % HexString(header->orientation) @@ -1528,9 +1528,9 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio iconSize = combo->iconSize(); #endif if (checked) - pixmap = menuItem->icon.pixmap(iconSize, painter->device()->devicePixelRatio(), mode, QIcon::On); + pixmap = menuItem->icon.pixmap(iconSize, QStyleHelper::getDpr(painter), mode, QIcon::On); else - pixmap = menuItem->icon.pixmap(iconSize, painter->device()->devicePixelRatio(), mode); + pixmap = menuItem->icon.pixmap(iconSize, QStyleHelper::getDpr(painter), mode); QRect pmr(QPoint(0, 0), pixmap.deviceIndependentSize().toSize()); pmr.moveCenter(vCheckRect.center()); @@ -1881,7 +1881,7 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption #if QT_CONFIG(spinbox) case CC_SpinBox: if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) { - const qreal dpr = painter->device()->devicePixelRatio(); + const qreal dpr = QStyleHelper::getDpr(painter); QPixmap cache; QString pixmapName = QStyleHelper::uniqueName("spinbox"_L1, spinBox, spinBox->rect.size(), dpr); if (!QPixmapCache::find(pixmapName, &cache)) { @@ -2578,7 +2578,7 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption bool hasFocus = option->state & State_HasFocus && option->state & State_KeyboardFocusChange; bool sunken = comboBox->state & State_On; // play dead, if combobox has no items bool isEnabled = (comboBox->state & State_Enabled); - const qreal dpr = painter->device()->devicePixelRatio(); + const qreal dpr = QStyleHelper::getDpr(painter); QPixmap cache; const QString pixmapName = QStyleHelper::uniqueName("combobox"_L1 % QLatin1StringView(sunken ? "-sunken" : "") @@ -2675,7 +2675,7 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption #if QT_CONFIG(slider) case CC_Slider: if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) { - const qreal dpr = painter->device()->devicePixelRatio(); + const qreal dpr = QStyleHelper::getDpr(painter); QRect groove = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove, widget); QRect handle = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget); @@ -3714,13 +3714,9 @@ QIcon QFusionStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption QPixmap QFusionStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget) const { - auto getDevicePixelRatio = [](const QWidget *widget) - { - return widget ? widget->devicePixelRatio() : qApp->devicePixelRatio(); - }; const auto icon = iconFromTheme(standardPixmap); if (!icon.availableSizes().isEmpty()) - return icon.pixmap(QSize(16, 16), getDevicePixelRatio(widget)); + return icon.pixmap(QSize(16, 16), QStyleHelper::getDpr(widget)); return QCommonStyle::standardPixmap(standardPixmap, opt, widget); } diff --git a/src/widgets/styles/qstyle_p.h b/src/widgets/styles/qstyle_p.h index 59e87810c54..d04dd491520 100644 --- a/src/widgets/styles/qstyle_p.h +++ b/src/widgets/styles/qstyle_p.h @@ -47,7 +47,7 @@ inline QPixmap styleCachePixmap(const QSize &size, qreal pixelRatio) QRect rect = option->rect; \ QPixmap internalPixmapCache; \ QPainter *p = painter; \ - const auto dpr = p->device()->devicePixelRatio(); \ + const auto dpr = QStyleHelper::getDpr(p); \ const QString unique = QStyleHelper::uniqueName((a), option, option->rect.size(), dpr); \ int txType = painter->deviceTransform().type() | painter->worldTransform().type(); \ const bool doPixmapCache = (!option->rect.isEmpty()) \ diff --git a/src/widgets/styles/qstylehelper_p.h b/src/widgets/styles/qstylehelper_p.h index 98470ad1ced..60673163bca 100644 --- a/src/widgets/styles/qstylehelper_p.h +++ b/src/widgets/styles/qstylehelper_p.h @@ -8,6 +8,8 @@ #include <QtGui/qpolygon.h> #include <QtCore/qstringbuilder.h> #include <QtGui/qaccessible.h> +#include <QtGui/qpainter.h> +#include <QtWidgets/qwidget.h> #ifndef QSTYLEHELPER_P_H #define QSTYLEHELPER_P_H @@ -29,12 +31,10 @@ QT_BEGIN_NAMESPACE class QColor; class QObject; -class QPainter; class QPalette; class QPixmap; class QStyleOptionSlider; class QStyleOption; -class QWidget; class QWindow; namespace QStyleHelper @@ -65,6 +65,21 @@ namespace QStyleHelper enum WidgetSizePolicy { SizeLarge = 0, SizeSmall = 1, SizeMini = 2, SizeDefault = -1 }; Q_WIDGETS_EXPORT WidgetSizePolicy widgetSizePolicy(const QWidget *w, const QStyleOption *opt = nullptr); + + // returns the device pixel ratio of the widget or the global one + // if widget is a nullptr + static inline qreal getDpr(const QWidget *widget) + { + return widget ? widget->devicePixelRatio() + : qApp->devicePixelRatio(); + } + + // returns the device pixel ratio of the painters underlying paint device + static inline qreal getDpr(const QPainter *painter) + { + Q_ASSERT(painter && painter->device()); + return painter->device()->devicePixelRatio(); + } } diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index 004326e0a44..17420215e39 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -82,6 +82,7 @@ #include <QLabel> #endif #include "qdrawutil.h" +#include "qstylehelper_p.h" #include <limits.h> #if QT_CONFIG(toolbar) @@ -3539,7 +3540,7 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC break; subRule.drawRule(p, opt->rect); QHash<QStyle::SubControl, QRect> layout = titleBarLayout(w, tb); - const auto paintDeviceDpr = p->device()->devicePixelRatio(); + const auto paintDeviceDpr = QStyleHelper::getDpr(p); QRect ir; ir = layout[SC_TitleBarLabel]; @@ -3620,7 +3621,7 @@ void QStyleSheetStyle::renderMenuItemIcon(const QStyleOptionMenuItem *mi, QPaint const bool checked = mi->checkType != QStyleOptionMenuItem::NotCheckable && mi->checked; const auto iconSize = pixelMetric(PM_SmallIconSize, mi, w); const QSize sz(iconSize, iconSize); - const QPixmap pixmap(mi->icon.pixmap(sz, p->device()->devicePixelRatio(), mode, + const QPixmap pixmap(mi->icon.pixmap(sz, QStyleHelper::getDpr(p), mode, checked ? QIcon::On : QIcon::Off)); const int pixw = pixmap.width() / pixmap.devicePixelRatio(); const int pixh = pixmap.height() / pixmap.devicePixelRatio(); @@ -3755,7 +3756,7 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q if (button->state & State_On) state = QIcon::On; - const auto paintDeviceDpr = p->device()->devicePixelRatio(); + const auto paintDeviceDpr = QStyleHelper::getDpr(p); QPixmap pixmap = icon.pixmap(button->iconSize, paintDeviceDpr, mode, state); int pixmapWidth = pixmap.width() / pixmap.devicePixelRatio(); int pixmapHeight = pixmap.height() / pixmap.devicePixelRatio(); @@ -4058,7 +4059,7 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q if (spacing == -1) spacing = 6; QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal : QIcon::Disabled; - const auto paintDeviceDpr = p->device()->devicePixelRatio(); + const auto paintDeviceDpr = QStyleHelper::getDpr(p); QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, paintDeviceDpr, mode); QRect iconRect(editRect); iconRect.setWidth(cb->iconSize.width()); @@ -5648,8 +5649,7 @@ QPixmap QStyleSheetStyle::standardPixmap(StandardPixmap standardPixmap, const QS QRenderRule rule = renderRule(w, opt); if (rule.hasStyleHint(s)) { QIcon icon = qvariant_cast<QIcon>(rule.styleHint(s)); - const auto dpr = w ? w->devicePixelRatio() : qApp->devicePixelRatio(); - return icon.pixmap(QSize(16, 16), dpr); + return icon.pixmap(QSize(16, 16), QStyleHelper::getDpr(w)); } } return baseStyle()->standardPixmap(standardPixmap, opt, w); |