From 52103b54992d7c0ac7b2a495429c53e75074cd23 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Fri, 6 Dec 2024 13:38:34 +0100 Subject: [PATCH] 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 Change-Id: I8e79423cfeff24143cd051b282503c4565125b4d Reviewed-by: Volker Hilsheimer (cherry picked from commit 5731fe051e48e7a256ef31ae93cfb89ce8d871cc) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 0dd2561d54209666cf78d053caf9b2d94fb1d80e) --- src/widgets/styles/qstylesheetstyle.cpp | 6 ++--- .../qstylesheetstyle/tst_qstylesheetstyle.cpp | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index 8f980394c52..8390e352f09 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -6465,9 +6465,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(w->parent())) { - - font = font.resolve(static_cast(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) diff --git a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp index a9a1817b8a0..a1bbf14bd61 100644 --- a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp +++ b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp @@ -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(); + 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"