QStyleSheetStyle: avoid double lookups to QRenderRule::styleHints

Avoid double lookups to QRenderRule::styleHints by simply checking if
the returned QVariant from styleHint() is default-constructed.

Pick-to: 6.8
Change-Id: I4ca657662c2af66582fb4fc7c2ed1b77258ab050
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Christian Ehrlicher 2024-11-15 14:05:19 +01:00
parent 11dc7e1c05
commit f1fd15b454

View File

@ -612,7 +612,6 @@ public:
return csz; return csz;
} }
bool hasStyleHint(QLatin1StringView sh) const { return styleHints.contains(sh); }
QVariant styleHint(QLatin1StringView sh) const { return styleHints.value(sh); } QVariant styleHint(QLatin1StringView sh) const { return styleHints.value(sh); }
void fixupBorder(int); void fixupBorder(int);
@ -5257,11 +5256,12 @@ int QStyleSheetStyle::pixelMetric(PixelMetric m, const QStyleOption *opt, const
case PM_TabBarIconSize: case PM_TabBarIconSize:
case PM_MessageBoxIconSize: case PM_MessageBoxIconSize:
case PM_ButtonIconSize: case PM_ButtonIconSize:
case PM_SmallIconSize: case PM_SmallIconSize: {
if (rule.hasStyleHint("icon-size"_L1)) const auto styleHint = rule.styleHint("icon-size"_L1);
return rule.styleHint("icon-size"_L1).toSize().width(); if (styleHint.isValid() && styleHint.canConvert<QSize>())
return styleHint.toSize().width();
break; break;
}
case PM_DockWidgetTitleMargin: { case PM_DockWidgetTitleMargin: {
QRenderRule subRule = renderRule(w, opt, PseudoElement_DockWidgetTitle); QRenderRule subRule = renderRule(w, opt, PseudoElement_DockWidgetTitle);
if (!subRule.hasBox()) if (!subRule.hasBox())
@ -5664,9 +5664,9 @@ QIcon QStyleSheetStyle::standardIcon(StandardPixmap standardIcon, const QStyleOp
RECURSION_GUARD(return baseStyle()->standardIcon(standardIcon, opt, w)) RECURSION_GUARD(return baseStyle()->standardIcon(standardIcon, opt, w))
const auto s = propertyNameForStandardPixmap(standardIcon); const auto s = propertyNameForStandardPixmap(standardIcon);
if (!s.isEmpty()) { if (!s.isEmpty()) {
QRenderRule rule = renderRule(w, opt); const auto styleHint = renderRule(w, opt).styleHint(s);
if (rule.hasStyleHint(s)) if (styleHint.isValid() && styleHint.canConvert<QIcon>())
return qvariant_cast<QIcon>(rule.styleHint(s)); return qvariant_cast<QIcon>(styleHint);
} }
return baseStyle()->standardIcon(standardIcon, opt, w); return baseStyle()->standardIcon(standardIcon, opt, w);
} }
@ -5682,9 +5682,9 @@ QPixmap QStyleSheetStyle::standardPixmap(StandardPixmap standardPixmap, const QS
RECURSION_GUARD(return baseStyle()->standardPixmap(standardPixmap, opt, w)) RECURSION_GUARD(return baseStyle()->standardPixmap(standardPixmap, opt, w))
const auto s = propertyNameForStandardPixmap(standardPixmap); const auto s = propertyNameForStandardPixmap(standardPixmap);
if (!s.isEmpty()) { if (!s.isEmpty()) {
QRenderRule rule = renderRule(w, opt); const auto styleHint = renderRule(w, opt).styleHint(s);
if (rule.hasStyleHint(s)) { if (styleHint.isValid() && styleHint.canConvert<QIcon>()) {
QIcon icon = qvariant_cast<QIcon>(rule.styleHint(s)); QIcon icon = qvariant_cast<QIcon>(styleHint);
return icon.pixmap(QSize(16, 16), QStyleHelper::getDpr(w)); return icon.pixmap(QSize(16, 16), QStyleHelper::getDpr(w));
} }
} }
@ -5802,8 +5802,10 @@ int QStyleSheetStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWi
break; break;
default: break; default: break;
} }
if (!s.isEmpty() && rule.hasStyleHint(s)) { if (!s.isEmpty()) {
return rule.styleHint(s).toInt(); const auto styleHint = rule.styleHint(s);
if (styleHint.isValid() && styleHint.canConvert<int>())
return styleHint.toInt();
} }
return baseStyle()->styleHint(sh, opt, w, shret); return baseStyle()->styleHint(sh, opt, w, shret);