Windows11Style: don't create a QPen when not needed

Use QPainter::setPen(QColor) and QPainter::setBrush(QColor) overload
instead creating a temporary QPen/QBrush to gain advantaged of the newly
introduced QPen and QBrush assignment functions from
ab53500cfa11b988e7e4234583fa6eb5027b4c08

Pick-to: 6.9
Change-Id: I3b8c4f7d669a08558cf6abcc77c23a4fdda99c02
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Christian Ehrlicher 2025-01-31 17:22:27 +01:00
parent 23e67332a0
commit 82a5e8bdb7
3 changed files with 55 additions and 60 deletions

View File

@ -261,19 +261,17 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
cp->restore();
}
const QRectF frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
const QBrush fillBrush = option->palette.brush(QPalette::Base);
cp->setBrush(fillBrush);
cp->setPen(QPen(highContrastTheme == true ? sb->palette.buttonText().color()
: WINUI3Colors[colorSchemeIndex][frameColorLight]));
cp->setBrush(option->palette.brush(QPalette::Base));
cp->setPen(highContrastTheme == true ? sb->palette.buttonText().color()
: WINUI3Colors[colorSchemeIndex][frameColorLight]);
cp->drawRoundedRect(frameRect, secondLevelRoundingRadius, secondLevelRoundingRadius);
const QPoint mousePos = widget ? widget->mapFromGlobal(QCursor::pos()) : QPoint();
if (sub & SC_SpinBoxEditField) {
const QRect rect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxEditField,
widget).adjusted(0, 0, 0, 1);
if (!(state & State_HasFocus) && rect.contains(mousePos)) {
const QColor fillColor = WINUI3Colors[colorSchemeIndex][subtleHighlightColor];
cp->setPen(Qt::NoPen);
cp->setBrush(QBrush(fillColor));
cp->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
cp->drawRoundedRect(option->rect.adjusted(2, 2, -2, -2), secondLevelRoundingRadius,
secondLevelRoundingRadius);
}
@ -284,9 +282,8 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
if (isUp)
rect.adjust(0, 0, 0, 1);
if (rect.contains(mousePos)) {
const QColor hoverColor = WINUI3Colors[colorSchemeIndex][subtleHighlightColor];
cp->setPen(Qt::NoPen);
cp->setBrush(QBrush(hoverColor));
cp->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
cp->drawRoundedRect(rect.adjusted(1, 1, -1, -1), secondLevelRoundingRadius,
secondLevelRoundingRadius);
}
@ -328,10 +325,11 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
painter->setPen(Qt::NoPen);
painter->setBrush(option->palette.accent());
painter->drawRoundedRect(leftRect,1,1);
painter->setBrush(QBrush(WINUI3Colors[colorSchemeIndex][controlStrongFill]));
painter->setBrush(WINUI3Colors[colorSchemeIndex][controlStrongFill]);
painter->drawRoundedRect(rightRect,1,1);
painter->setPen(QPen(highContrastTheme == true ? slider->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]));
painter->setPen(highContrastTheme == true ? slider->palette.buttonText().color()
: WINUI3Colors[colorSchemeIndex][frameColorLight]);
painter->setBrush(Qt::NoBrush);
painter->drawRoundedRect(leftRect,1.5,1.5);
painter->drawRoundedRect(rightRect,1.5,1.5);
@ -418,12 +416,12 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
const float innerRadius = option->styleObject->property("_q_inner_radius").toFloat();
painter->setRenderHint(QPainter::Antialiasing, true);
painter->setPen(Qt::NoPen);
painter->setBrush(QBrush(WINUI3Colors[colorSchemeIndex][controlFillSolid]));
painter->setBrush(WINUI3Colors[colorSchemeIndex][controlFillSolid]);
painter->drawEllipse(center, outerRadius, outerRadius);
painter->setBrush(option->palette.accent());
painter->drawEllipse(center, innerRadius, innerRadius);
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]));
painter->setPen(WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]);
painter->setBrush(Qt::NoBrush);
painter->drawEllipse(center, outerRadius + 0.5, outerRadius + 0.5);
painter->drawEllipse(center, innerRadius + 0.5, innerRadius + 0.5);
@ -441,17 +439,15 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
#if QT_CONFIG(combobox)
case CC_ComboBox:
if (const QStyleOptionComboBox *combobox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
QBrush fillColor = combobox->palette.brush(QPalette::Base);
QRectF rect = option->rect.marginsRemoved(QMargins(1, 1, 1, 1));
painter->setBrush(fillColor);
painter->setBrush(combobox->palette.brush(QPalette::Base));
painter->setPen(Qt::NoPen);
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
// In case the QComboBox is hovered overdraw the background with a alpha mask to
// highlight the QComboBox.
if (state & State_MouseOver) {
fillColor = QBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
painter->setBrush(fillColor);
painter->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
painter->setPen(Qt::NoPen);
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
}
@ -557,7 +553,7 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
if (hover)
painter->fillRect(closeButtonRect,shellCloseButtonColor);
const QString textToDraw(QStringLiteral(u"\uE8BB"));
painter->setPen(QPen(hover ? option->palette.highlightedText().color() : option->palette.text().color()));
painter->setPen(hover ? option->palette.highlightedText().color() : option->palette.text().color());
painter->setFont(buttonFont);
painter->drawText(closeButtonRect, Qt::AlignVCenter | Qt::AlignHCenter, textToDraw);
}
@ -569,7 +565,7 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
if (hover)
painter->fillRect(normalButtonRect,WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
const QString textToDraw(QStringLiteral(u"\uE923"));
painter->setPen(QPen(option->palette.text().color()));
painter->setPen(option->palette.text().color());
painter->setFont(buttonFont);
painter->drawText(normalButtonRect, Qt::AlignVCenter | Qt::AlignHCenter, textToDraw);
}
@ -581,7 +577,7 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
if (hover)
painter->fillRect(minButtonRect,WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
const QString textToDraw(QStringLiteral(u"\uE921"));
painter->setPen(QPen(option->palette.text().color()));
painter->setPen(option->palette.text().color());
painter->setFont(buttonFont);
painter->drawText(minButtonRect, Qt::AlignVCenter | Qt::AlignHCenter, textToDraw);
}
@ -591,7 +587,7 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
case CC_TitleBar:
if (const auto* titlebar = qstyleoption_cast<const QStyleOptionTitleBar*>(option)) {
painter->setPen(Qt::NoPen);
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]));
painter->setPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]);
painter->setBrush(titlebar->palette.button());
painter->drawRect(titlebar->rect);
@ -824,7 +820,8 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
painter->setBrush(buttonFillBrush(option));
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius, Qt::AbsoluteSize);
painter->setPen(QPen(highContrastTheme == true ? option->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorStrong]));
painter->setPen(highContrastTheme == true ? option->palette.buttonText().color()
: WINUI3Colors[colorSchemeIndex][frameColorStrong]);
painter->setBrush(Qt::NoBrush);
painter->drawRoundedRect(rect, secondLevelRoundingRadius + 0.5, secondLevelRoundingRadius + 0.5, Qt::AbsoluteSize);
@ -880,18 +877,16 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
path.addEllipse(center,innerRadius,innerRadius);
painter->drawPath(path);
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][frameColorStrong]));
painter->setPen(WINUI3Colors[colorSchemeIndex][frameColorStrong]);
painter->setBrush(Qt::NoBrush);
painter->drawEllipse(center, 7.5, 7.5);
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][frameColorStrong]));
painter->setBrush(Qt::NoBrush);
painter->drawEllipse(center,innerRadius + 0.5, innerRadius + 0.5);
painter->setPen(Qt::NoPen);
painter->setBrush(QBrush(option->palette.window()));
if (option->state & State_MouseOver && option->state & State_Enabled)
painter->setBrush(QBrush(option->palette.window().color().darker(107)));
painter->setBrush(option->palette.window().color().darker(107));
else
painter->setBrush(option->palette.window());
painter->drawEllipse(center,innerRadius, innerRadius);
}
break;
@ -904,7 +899,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
if (element == PE_PanelButtonTool && ((!isMouseOver && !isRaised) || !isEnabled))
painter->setPen(Qt::NoPen);
else
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlStrokePrimary]));
painter->setPen(WINUI3Colors[colorSchemeIndex][controlStrokePrimary]);
painter->setBrush(buttonFillBrush(option));
painter->drawRoundedRect(rect,
secondLevelRoundingRadius, secondLevelRoundingRadius);
@ -919,7 +914,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
if (isRaised) {
const qreal sublineOffset = secondLevelRoundingRadius - 0.5;
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]));
painter->setPen(WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]);
painter->drawLine(rect.bottomLeft() + QPointF(sublineOffset, 0.5), rect.bottomRight() + QPointF(-sublineOffset, 0.5));
}
}
@ -933,10 +928,9 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
break;
case PE_PanelMenu: {
const QRect rect = option->rect.marginsRemoved(QMargins(2, 2, 2, 2));
QPen pen(WINUI3Colors[colorSchemeIndex][frameColorLight]);
painter->save();
painter->setPen(pen);
painter->setBrush(QBrush(WINUI3Colors[colorSchemeIndex][menuPanelFill]));
painter->setPen(WINUI3Colors[colorSchemeIndex][frameColorLight]);
painter->setBrush(WINUI3Colors[colorSchemeIndex][menuPanelFill]);
painter->setRenderHint(QPainter::Antialiasing);
painter->drawRoundedRect(rect, topLevelRoundingRadius, topLevelRoundingRadius);
painter->restore();
@ -947,15 +941,13 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
break;
if (const auto *panel = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
QRectF frameRect = option->rect.marginsRemoved(QMargins(1, 1, 1, 1));
QBrush fillColor = option->palette.brush(QPalette::Base);
painter->setBrush(fillColor);
painter->setBrush(option->palette.brush(QPalette::Base));
painter->setPen(Qt::NoPen);
painter->drawRoundedRect(frameRect, secondLevelRoundingRadius, secondLevelRoundingRadius);
// In case the QLineEdit is hovered overdraw the background with a alpha mask to
// highlight the QLineEdit.
if (state & State_MouseOver && !(state & State_HasFocus)) {
fillColor = QBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
painter->setBrush(fillColor);
painter->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
painter->setPen(Qt::NoPen);
painter->drawRoundedRect(frameRect, secondLevelRoundingRadius, secondLevelRoundingRadius);
}
@ -970,7 +962,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
QRectF rect = option->rect;
rect.adjust(1.5, 1.5, -1.5, -1.5);
painter->setBrush(Qt::NoBrush);
painter->setPen(highContrastTheme == true ? option->palette.buttonText().color() : QPen(WINUI3Colors[colorSchemeIndex][frameColorLight]));
painter->setPen(highContrastTheme == true ? option->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]);
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
painter->setPen(editSublineColor(option, colorSchemeIndex));
painter->drawLine(option->rect.bottomLeft() + QPointF(sublineOffset, 0.5), option->rect.bottomRight() + QPointF(-sublineOffset, 0.5));
@ -992,13 +984,13 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
painter->setBrush(Qt::NoBrush);
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][frameColorLight]));
painter->setPen(WINUI3Colors[colorSchemeIndex][frameColorLight]);
painter->drawRoundedRect(rect.marginsRemoved(QMarginsF(0.5,0.5,0.5,0.5)), secondLevelRoundingRadius, secondLevelRoundingRadius);
if (qobject_cast<const QTextEdit *>(widget)) {
QRegion clipRegion = option->rect;
QColor lineColor = state & State_HasFocus ? option->palette.accent().color() : QColor(0,0,0,255);
painter->setPen(QPen(lineColor));
painter->setPen(lineColor);
painter->drawLine(option->rect.bottomLeft() + QPoint(1,-1), option->rect.bottomRight() + QPoint(-1,-1));
}
}
@ -1110,7 +1102,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
painter->drawLine(QPointF(rect.right(), rect.top()),
QPointF(rect.right(), rect.bottom() - fwidth));
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]));
painter->setPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]);
painter->drawLine(QPointF(rect.left() + 0.5, rect.top() + 0.5),
QPointF(rect.left() + 0.5, rect.bottom() - 0.5 - secondLevelRoundingRadius));
painter->drawLine(QPointF(rect.left() + 0.5 + secondLevelRoundingRadius, rect.bottom() - 0.5),
@ -1125,7 +1117,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
painter->drawPie(bottomLeftCorner.marginsAdded(QMarginsF(0.0,2.5,2.5,0.0)),
-90 * 16,-90 * 16);
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]));
painter->setPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]);
painter->setBrush(Qt::NoBrush);
painter->drawArc(bottomRightCorner,
0 * 16,-90 * 16);
@ -1199,7 +1191,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
rect.translate(shiftX, shiftY);
painter->setFont(toolbutton->font);
const QString text = d->toolButtonElideText(toolbutton, rect, alignment);
painter->setPen(buttonLabelPen(option, colorSchemeIndex));
painter->setPen(buttonLabelColor(option, colorSchemeIndex));
proxy()->drawItemText(painter, rect, alignment, toolbutton->palette,
toolbutton->state & State_Enabled, text);
} else {
@ -1250,7 +1242,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
}
tr.translate(shiftX, shiftY);
const QString text = d->toolButtonElideText(toolbutton, tr, alignment);
painter->setPen(buttonLabelPen(option, colorSchemeIndex));
painter->setPen(buttonLabelColor(option, colorSchemeIndex));
proxy()->drawItemText(painter, QStyle::visualRect(toolbutton->direction, rect, tr), alignment, toolbutton->palette,
toolbutton->state & State_Enabled, text);
} else {
@ -1407,7 +1399,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
textRect = textRect.adjusted(indicatorSize, 0, 0, 0);
}
painter->drawText(indicatorRect, QStringLiteral(u"\uE70D"), Qt::AlignVCenter | Qt::AlignHCenter);
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlStrokePrimary]));
painter->setPen(WINUI3Colors[colorSchemeIndex][controlStrokePrimary]);
painter->drawLine(menuSplitter);
}
if (!btn->icon.isNull()) {
@ -1452,7 +1444,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
tf |= Qt::AlignHCenter;
}
painter->setPen(buttonLabelPen(option, colorSchemeIndex));
painter->setPen(buttonLabelColor(option, colorSchemeIndex));
proxy()->drawItemText(painter, textRect, tf, option->palette,btn->state & State_Enabled, btn->text);
}
break;
@ -1482,11 +1474,14 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
rect.adjust(0.5,0.5,-0.5,-0.5);
const bool defaultButton = btn->features.testFlag(QStyleOptionButton::DefaultButton);
painter->setBrush(Qt::NoBrush);
painter->setPen(btn->features.testFlag(QStyleOptionButton::DefaultButton) ? QPen(option->palette.accent().color()) : QPen(WINUI3Colors[colorSchemeIndex][controlStrokePrimary]));
painter->setPen(defaultButton ? option->palette.accent().color()
: WINUI3Colors[colorSchemeIndex][controlStrokePrimary]);
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
painter->setPen(btn->features.testFlag(QStyleOptionButton::DefaultButton) ? QPen(WINUI3Colors[colorSchemeIndex][controlStrokeOnAccentSecondary]) : QPen(WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]));
painter->setPen(defaultButton ? WINUI3Colors[colorSchemeIndex][controlStrokeOnAccentSecondary]
: WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]);
if (flags & State_Raised)
painter->drawLine(rect.bottomLeft() + QPointF(4.0,0.0), rect.bottomRight() + QPointF(-4,0.0));
}
@ -1784,14 +1779,14 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state);
if (!view || !view->isPersistentEditorOpen(vopt->index)) {
painter->setPen(QPen(option->palette.text().color()));
painter->setPen(option->palette.text().color());
d->viewItemDrawText(painter, vopt, textRect);
}
// paint a vertical marker for QListView
if (vopt->state & State_Selected) {
if (const QListView *lv = qobject_cast<const QListView *>(widget);
lv && lv->viewMode() != QListView::IconMode) {
painter->setPen(QPen(vopt->palette.accent().color()));
painter->setPen(vopt->palette.accent().color());
const auto xPos = isRtl ? rect.right() - 1 : rect.left();
const QLineF lines[2] = {
QLineF(xPos, rect.y() + 2, xPos, rect.y() + rect.height() - 2),
@ -2373,20 +2368,20 @@ QBrush QWindows11Style::buttonFillBrush(const QStyleOption *option)
return brush;
}
QPen QWindows11Style::buttonLabelPen(const QStyleOption *option, int colorSchemeIndex)
QColor QWindows11Style::buttonLabelColor(const QStyleOption *option, int colorSchemeIndex)
{
if (option->palette.isBrushSet(QPalette::Current, QPalette::ButtonText))
return QPen(option->palette.buttonText().color());
return option->palette.buttonText().color();
const bool isOn = option->state & QStyle::State_On;
if (option->state & QStyle::State_Sunken)
return QPen(isOn ? WINUI3Colors[colorSchemeIndex][textOnAccentSecondary]
: WINUI3Colors[colorSchemeIndex][controlTextSecondary]);
return isOn ? WINUI3Colors[colorSchemeIndex][textOnAccentSecondary]
: WINUI3Colors[colorSchemeIndex][controlTextSecondary];
if (!(option->state & QStyle::State_Enabled))
return QPen(isOn ? WINUI3Colors[colorSchemeIndex][textAccentDisabled]
: option->palette.buttonText().color());
return QPen(isOn ? WINUI3Colors[colorSchemeIndex][textOnAccentPrimary]
: option->palette.buttonText().color());
return isOn ? WINUI3Colors[colorSchemeIndex][textAccentDisabled]
: option->palette.buttonText().color();
return isOn ? WINUI3Colors[colorSchemeIndex][textOnAccentPrimary]
: option->palette.buttonText().color();
}
QColor QWindows11Style::editSublineColor(const QStyleOption *option, int colorSchemeIndex)

View File

@ -54,7 +54,7 @@ protected:
private:
static inline QBrush buttonFillBrush(const QStyleOption *option);
static inline QPen buttonLabelPen(const QStyleOption *option, int colorSchemeIndex);
static inline QColor buttonLabelColor(const QStyleOption *option, int colorSchemeIndex);
static inline QColor editSublineColor(const QStyleOption *option, int colorSchemeIndex);
private:

View File

@ -1912,10 +1912,10 @@ void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOpt
// we try to check if this lineedit is a delegate on a QAbstractItemView-derived class.
QPen oldPen = painter->pen();
// Inner white border
painter->setPen(QPen(option->palette.base().color(), 1));
painter->setPen(option->palette.base().color());
painter->drawRect(option->rect.adjusted(1, 1, -2, -2));
// Outer dark border
painter->setPen(QPen(option->palette.shadow().color(), 1));
painter->setPen(option->palette.shadow().color());
painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
painter->setPen(oldPen);
return;