QCommonStyle: Select high-dpi pixmaps from icons
Pass a QWindow pointer to QIcon::pixmap(), which allows it to select a pixmap based on the target device pixel ratio. Change-Id: Ib592de2a25060658b70b4e4ab7ff5fbaa9b60260 Task-number: QTBUG-44424 Task-number: QTBUG-38100 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>bb10
parent
25717bedfb
commit
74a2e29705
|
|
@ -80,6 +80,11 @@
|
|||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
static QWindow *qt_getWindow(const QWidget *widget)
|
||||
{
|
||||
return widget ? widget->window()->windowHandle() : 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
\class QCommonStyle
|
||||
\brief The QCommonStyle class encapsulates the common Look and Feel of a GUI.
|
||||
|
|
@ -395,7 +400,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(size, mode, state);
|
||||
QPixmap pixmap = d->tabBarcloseButtonIcon.pixmap(qt_getWindow(widget), QSize(size, size), mode, state);
|
||||
proxy()->drawItemPixmap(p, opt->rect, Qt::AlignCenter, pixmap);
|
||||
break;
|
||||
}
|
||||
|
|
@ -1237,7 +1242,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
|
|||
if (button->state & State_On)
|
||||
state = QIcon::On;
|
||||
|
||||
QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
|
||||
QPixmap pixmap = button->icon.pixmap(qt_getWindow(widget), button->iconSize, mode, state);
|
||||
|
||||
int pixmapWidth = pixmap.width() / pixmap.devicePixelRatio();
|
||||
int pixmapHeight = pixmap.height() / pixmap.devicePixelRatio();
|
||||
|
|
@ -1314,7 +1319,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, btn->state & State_Enabled ? QIcon::Normal : QIcon::Disabled);
|
||||
pix = btn->icon.pixmap(qt_getWindow(widget), btn->iconSize, 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);
|
||||
|
|
@ -1355,7 +1360,8 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
|
|||
| Qt::TextSingleLine;
|
||||
if (!proxy()->styleHint(SH_UnderlineShortcut, mbi, widget))
|
||||
alignment |= Qt::TextHideMnemonic;
|
||||
QPixmap pix = mbi->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize), (mbi->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled);
|
||||
int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
|
||||
QPixmap pix = mbi->icon.pixmap(qt_getWindow(widget), QSize(iconExtent, iconExtent), (mbi->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled);
|
||||
if (!pix.isNull())
|
||||
proxy()->drawItemPixmap(p,mbi->rect, alignment, pix);
|
||||
else
|
||||
|
|
@ -1519,8 +1525,9 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
|
|||
if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
|
||||
QRect rect = header->rect;
|
||||
if (!header->icon.isNull()) {
|
||||
int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
|
||||
QPixmap pixmap
|
||||
= header->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize), (header->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled);
|
||||
= header->icon.pixmap(qt_getWindow(widget), QSize(iconExtent, iconExtent), (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);
|
||||
|
|
@ -1579,7 +1586,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),
|
||||
pm = toolbutton->icon.pixmap(qt_getWindow(widget), toolbutton->rect.size().boundedTo(toolbutton->iconSize),
|
||||
mode, state);
|
||||
pmSize = pm.size() / pm.devicePixelRatio();
|
||||
}
|
||||
|
|
@ -1800,7 +1807,8 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
|
|||
if (const QStyleOptionToolBox *tb = qstyleoption_cast<const QStyleOptionToolBox *>(opt)) {
|
||||
bool enabled = tb->state & State_Enabled;
|
||||
bool selected = tb->state & State_Selected;
|
||||
QPixmap pm = tb->icon.pixmap(proxy()->pixelMetric(QStyle::PM_SmallIconSize, tb, widget),
|
||||
int iconExtent = proxy()->pixelMetric(QStyle::PM_SmallIconSize, tb, widget);
|
||||
QPixmap pm = tb->icon.pixmap(qt_getWindow(widget), QSize(iconExtent, iconExtent),
|
||||
enabled ? QIcon::Normal : QIcon::Disabled);
|
||||
|
||||
QRect cr = subElementRect(QStyle::SE_ToolBoxTabContents, tb, widget);
|
||||
|
|
@ -1875,7 +1883,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
|
|||
tr = proxy()->subElementRect(SE_TabBarTabText, opt, widget); //we compute tr twice because the style may override subElementRect
|
||||
|
||||
if (!tabV2.icon.isNull()) {
|
||||
QPixmap tabIcon = tabV2.icon.pixmap(tabV2.iconSize,
|
||||
QPixmap tabIcon = tabV2.icon.pixmap(qt_getWindow(widget), tabV2.iconSize,
|
||||
(tabV2.state & State_Enabled) ? QIcon::Normal
|
||||
: QIcon::Disabled,
|
||||
(tabV2.state & State_Selected) ? QIcon::On
|
||||
|
|
@ -2077,7 +2085,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, mode);
|
||||
QPixmap pixmap = cb->currentIcon.pixmap(qt_getWindow(widget), cb->iconSize, mode);
|
||||
QRect iconRect(editRect);
|
||||
iconRect.setWidth(cb->iconSize.width() + 4);
|
||||
iconRect = alignedRect(cb->direction,
|
||||
|
|
@ -2376,7 +2384,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, QIcon::Normal));
|
||||
btn->icon.pixmap(qt_getWindow(widget), btn->iconSize, QIcon::Normal));
|
||||
if (!textRect.isEmpty())
|
||||
textRect.translate(iconRect.right() + 4, 0);
|
||||
}
|
||||
|
|
@ -2424,7 +2432,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, QIcon::Normal));
|
||||
btn->icon.pixmap(qt_getWindow(widget), btn->iconSize, QIcon::Normal));
|
||||
if (!textRect.isEmpty())
|
||||
textRect.translate(iconRect.right() + 4, 0);
|
||||
}
|
||||
|
|
@ -3398,9 +3406,9 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl
|
|||
|| qobject_cast<const QDockWidget *>(widget)
|
||||
#endif
|
||||
)
|
||||
pm = proxy()->standardIcon(SP_DockWidgetCloseButton, &tool, widget).pixmap(10, 10);
|
||||
pm = proxy()->standardIcon(SP_DockWidgetCloseButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(10, 10));
|
||||
else
|
||||
pm = proxy()->standardIcon(SP_TitleBarCloseButton, &tool, widget).pixmap(10, 10);
|
||||
pm = proxy()->standardIcon(SP_TitleBarCloseButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(10, 10));
|
||||
tool.rect = ir;
|
||||
tool.state = down ? State_Sunken : State_Raised;
|
||||
proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
|
||||
|
|
@ -3419,7 +3427,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(10, 10);
|
||||
pm = proxy()->standardIcon(SP_TitleBarMaxButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(10, 10));
|
||||
tool.rect = ir;
|
||||
tool.state = down ? State_Sunken : State_Raised;
|
||||
proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
|
||||
|
|
@ -3437,7 +3445,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(10, 10);
|
||||
pm = proxy()->standardIcon(SP_TitleBarMinButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(10, 10));
|
||||
tool.rect = ir;
|
||||
tool.state = down ? State_Sunken : State_Raised;
|
||||
proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
|
||||
|
|
@ -3459,7 +3467,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(10, 10);
|
||||
pm = proxy()->standardIcon(SP_TitleBarNormalButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(10, 10));
|
||||
tool.rect = ir;
|
||||
tool.state = down ? State_Sunken : State_Raised;
|
||||
proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
|
||||
|
|
@ -3477,7 +3485,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(10, 10);
|
||||
pm = proxy()->standardIcon(SP_TitleBarShadeButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(10, 10));
|
||||
tool.rect = ir;
|
||||
tool.state = down ? State_Sunken : State_Raised;
|
||||
proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
|
||||
|
|
@ -3495,7 +3503,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(10, 10);
|
||||
pm = proxy()->standardIcon(SP_TitleBarUnshadeButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(10, 10));
|
||||
tool.rect = ir;
|
||||
tool.state = down ? State_Sunken : State_Raised;
|
||||
proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
|
||||
|
|
@ -3511,7 +3519,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(10, 10);
|
||||
pm = proxy()->standardIcon(SP_TitleBarContextHelpButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(10, 10));
|
||||
tool.rect = ir;
|
||||
tool.state = down ? State_Sunken : State_Raised;
|
||||
proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
|
||||
|
|
@ -3528,7 +3536,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(iconSize, iconSize);
|
||||
pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget).pixmap(qt_getWindow(widget), QSize(iconSize, iconSize));
|
||||
tool.rect = ir;
|
||||
p->save();
|
||||
proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
|
||||
|
|
@ -3715,7 +3723,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(16, 16);
|
||||
QPixmap pm = proxy()->standardIcon(SP_TitleBarCloseButton).pixmap(qt_getWindow(widget), QSize(16, 16));
|
||||
proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
|
||||
}
|
||||
if (opt->subControls & QStyle::SC_MdiNormalButton) {
|
||||
|
|
@ -3732,7 +3740,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(16, 16);
|
||||
QPixmap pm = proxy()->standardIcon(SP_TitleBarNormalButton).pixmap(qt_getWindow(widget), QSize(16, 16));
|
||||
proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
|
||||
}
|
||||
if (opt->subControls & QStyle::SC_MdiMinButton) {
|
||||
|
|
@ -3749,7 +3757,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(16, 16);
|
||||
QPixmap pm = proxy()->standardIcon(SP_TitleBarMinButton).pixmap(qt_getWindow(widget), QSize(16, 16));
|
||||
proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
|
||||
}
|
||||
}
|
||||
|
|
@ -5762,8 +5770,8 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption
|
|||
const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off);
|
||||
for (int i = 0 ; i < sizes.size() ; ++i) {
|
||||
int size = sizes[i].width();
|
||||
QPixmap basePixmap = baseIcon.pixmap(size);
|
||||
QPixmap linkPixmap = linkIcon.pixmap(size/2);
|
||||
QPixmap basePixmap = baseIcon.pixmap(qt_getWindow(widget), QSize(size, size));
|
||||
QPixmap linkPixmap = linkIcon.pixmap(qt_getWindow(widget), QSize(size / 2, size / 2));
|
||||
QPainter painter(&basePixmap);
|
||||
painter.drawPixmap(size/2, size/2, linkPixmap);
|
||||
icon.addPixmap(basePixmap);
|
||||
|
|
@ -5779,8 +5787,8 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption
|
|||
const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off);
|
||||
for (int i = 0 ; i < sizes.size() ; ++i) {
|
||||
int size = sizes[i].width();
|
||||
QPixmap basePixmap = baseIcon.pixmap(size);
|
||||
QPixmap linkPixmap = linkIcon.pixmap(size/2);
|
||||
QPixmap basePixmap = baseIcon.pixmap(qt_getWindow(widget), QSize(size, size));
|
||||
QPixmap linkPixmap = linkIcon.pixmap(qt_getWindow(widget), QSize(size / 2, size / 2));
|
||||
QPainter painter(&basePixmap);
|
||||
painter.drawPixmap(size/2, size/2, linkPixmap);
|
||||
icon.addPixmap(basePixmap);
|
||||
|
|
|
|||
Loading…
Reference in New Issue