QStyleSheetStyle: Fix resetting fonts for subwidgets

When a compound widget is styled with a font through a property and the
default styling has no font settings, the font was not reset to the
parent font but left it the styled state.
Fix it by not resolving the current font when the style rule has no font
settings - use the parent font directly instead.

Fixes: QTBUG-131685
Pick-to: 6.9 6.8
Change-Id: I8e79423cfeff24143cd051b282503c4565125b4d
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Christian Ehrlicher 2024-12-06 13:38:34 +01:00
parent 8ae4e3efdf
commit 5731fe051e
2 changed files with 27 additions and 3 deletions

View File

@ -6485,9 +6485,9 @@ void QStyleSheetStyle::updateStyleSheetFont(QWidget* w) const
font.setResolveMask(wf.resolveMask() | rule.font.resolveMask());
if ((!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))
&& isNaturalChild(w) && qobject_cast<QWidget *>(w->parent())) {
font = font.resolve(static_cast<QWidget *>(w->parent())->font());
&& isNaturalChild(w) && w->parentWidget()) {
const auto parentFont = w->parentWidget()->font();
font = rule.hasFont ? font.resolve(parentFont) : parentFont;
}
if (wf.resolveMask() == font.resolveMask() && wf == font)

View File

@ -125,6 +125,8 @@ private slots:
void inheritWidgetPalette_data();
void inheritWidgetPalette();
void resetFont();
private:
static QColor COLOR(const QWidget &w)
{
@ -2528,6 +2530,28 @@ void tst_QStyleSheetStyle::inheritWidgetPalette()
QCOMPARE(phColor, phColorPalette);
}
void tst_QStyleSheetStyle::resetFont()
{
QDoubleSpinBox sb;
sb.setStyleSheet(R"(QDoubleSpinBox[changed="true"] {font: italic;})");
auto checkFont = [&sb](bool isItalic) {
sb.setProperty("changed", isItalic);
sb.style()->polish(&sb);
const auto children = sb.findChildren<QWidget *>();
for (const auto *w : children) {
auto diagnostics = qScopeGuard([&] {
qWarning() << "Failure with" << w << "should be italic:" << isItalic;
});
QCOMPARE(w->font().italic(), isItalic);
diagnostics.dismiss();
}
};
checkFont(false);
checkFont(true);
checkFont(false);
}
QTEST_MAIN(tst_QStyleSheetStyle)
#include "tst_qstylesheetstyle.moc"