Skip to content

Commit

Permalink
QStyleSheetStyle: Fix resetting fonts for subwidgets
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
chehrlic committed Dec 17, 2024
1 parent 8ae4e3e commit 5731fe0
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/widgets/styles/qstylesheetstyle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ private slots:
void inheritWidgetPalette_data();
void inheritWidgetPalette();

void resetFont();

private:
static QColor COLOR(const QWidget &w)
{
Expand Down Expand Up @@ -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"

0 comments on commit 5731fe0

Please sign in to comment.