Fix resolve() on fonts returned from QWidget::font()
Set the inherited properties as resolved on the font, so non-default values are passed on in contexts that does resolve logic like QPainter. One test is updated as it actually tests what it is supposed to on more configurations. Fixes: QTBUG-39560 Change-Id: Ief668e992ccdc091337a259a4c1306a00e67c73f Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
76ee79b8b9
commit
e823c351c6
@ -247,6 +247,7 @@ QWidgetPrivate::QWidgetPrivate(int version)
|
|||||||
#ifndef QT_NO_TOOLTIP
|
#ifndef QT_NO_TOOLTIP
|
||||||
, toolTipDuration(-1)
|
, toolTipDuration(-1)
|
||||||
#endif
|
#endif
|
||||||
|
, directFontResolveMask(0)
|
||||||
, inheritedFontResolveMask(0)
|
, inheritedFontResolveMask(0)
|
||||||
, inheritedPaletteResolveMask(0)
|
, inheritedPaletteResolveMask(0)
|
||||||
, leftmargin(0)
|
, leftmargin(0)
|
||||||
@ -4751,6 +4752,18 @@ QFont QWidgetPrivate::naturalWidgetFont(uint inheritedMask) const
|
|||||||
return naturalFont;
|
return naturalFont;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\internal
|
||||||
|
|
||||||
|
Returns a font suitable for inheritance, where only locally set attributes are considered resolved.
|
||||||
|
*/
|
||||||
|
QFont QWidgetPrivate::localFont() const
|
||||||
|
{
|
||||||
|
QFont localfont = data.fnt;
|
||||||
|
localfont.resolve(directFontResolveMask);
|
||||||
|
return localfont;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\internal
|
\internal
|
||||||
|
|
||||||
@ -4762,7 +4775,7 @@ QFont QWidgetPrivate::naturalWidgetFont(uint inheritedMask) const
|
|||||||
void QWidgetPrivate::resolveFont()
|
void QWidgetPrivate::resolveFont()
|
||||||
{
|
{
|
||||||
QFont naturalFont = naturalWidgetFont(inheritedFontResolveMask);
|
QFont naturalFont = naturalWidgetFont(inheritedFontResolveMask);
|
||||||
QFont resolvedFont = data.fnt.resolve(naturalFont);
|
QFont resolvedFont = localFont().resolve(naturalFont);
|
||||||
setFont_helper(resolvedFont);
|
setFont_helper(resolvedFont);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4801,6 +4814,11 @@ void QWidgetPrivate::updateFont(const QFont &font)
|
|||||||
inheritedFontResolveMask = 0;
|
inheritedFontResolveMask = 0;
|
||||||
}
|
}
|
||||||
uint newMask = data.fnt.resolve() | inheritedFontResolveMask;
|
uint newMask = data.fnt.resolve() | inheritedFontResolveMask;
|
||||||
|
// Set the font as also having resolved inherited traits, so the result of reading QWidget::font()
|
||||||
|
// isn't all weak information, but save the original mask to be able to let new changes on the
|
||||||
|
// parent widget font propagate correctly.
|
||||||
|
directFontResolveMask = data.fnt.resolve();
|
||||||
|
data.fnt.resolve(newMask);
|
||||||
|
|
||||||
for (int i = 0; i < children.size(); ++i) {
|
for (int i = 0; i < children.size(); ++i) {
|
||||||
QWidget *w = qobject_cast<QWidget*>(children.at(i));
|
QWidget *w = qobject_cast<QWidget*>(children.at(i));
|
||||||
|
@ -383,10 +383,11 @@ public:
|
|||||||
|
|
||||||
void updateFont(const QFont &);
|
void updateFont(const QFont &);
|
||||||
inline void setFont_helper(const QFont &font) {
|
inline void setFont_helper(const QFont &font) {
|
||||||
if (data.fnt.resolve() == font.resolve() && data.fnt == font)
|
if (directFontResolveMask == font.resolve() && data.fnt == font)
|
||||||
return;
|
return;
|
||||||
updateFont(font);
|
updateFont(font);
|
||||||
}
|
}
|
||||||
|
QFont localFont() const;
|
||||||
void resolveFont();
|
void resolveFont();
|
||||||
QFont naturalWidgetFont(uint inheritedMask) const;
|
QFont naturalWidgetFont(uint inheritedMask) const;
|
||||||
|
|
||||||
@ -729,6 +730,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Other variables.
|
// Other variables.
|
||||||
|
uint directFontResolveMask;
|
||||||
uint inheritedFontResolveMask;
|
uint inheritedFontResolveMask;
|
||||||
uint inheritedPaletteResolveMask;
|
uint inheritedPaletteResolveMask;
|
||||||
short leftmargin;
|
short leftmargin;
|
||||||
|
@ -2642,7 +2642,7 @@ void QStyleSheetStyle::setPalette(QWidget *w)
|
|||||||
QRenderRule rule = renderRule(w, PseudoElement_None, map[i].state | extendedPseudoClass(w));
|
QRenderRule rule = renderRule(w, PseudoElement_None, map[i].state | extendedPseudoClass(w));
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
if (!w->property("_q_styleSheetWidgetFont").isValid()) {
|
if (!w->property("_q_styleSheetWidgetFont").isValid()) {
|
||||||
saveWidgetFont(w, w->font());
|
saveWidgetFont(w, w->d_func()->localFont());
|
||||||
}
|
}
|
||||||
updateStyleSheetFont(w);
|
updateStyleSheetFont(w);
|
||||||
if (ew != w)
|
if (ew != w)
|
||||||
@ -6025,7 +6025,7 @@ void QStyleSheetStyle::updateStyleSheetFont(QWidget* w) const
|
|||||||
unsetStyleSheetFont(w);
|
unsetStyleSheetFont(w);
|
||||||
|
|
||||||
if (rule.font.resolve()) {
|
if (rule.font.resolve()) {
|
||||||
QFont wf = w->font();
|
QFont wf = w->d_func()->localFont();
|
||||||
styleSheetCaches->customFontWidgets.insert(w, {wf, rule.font.resolve()});
|
styleSheetCaches->customFontWidgets.insert(w, {wf, rule.font.resolve()});
|
||||||
|
|
||||||
QFont font = rule.font.resolve(wf);
|
QFont font = rule.font.resolve(wf);
|
||||||
@ -6033,7 +6033,9 @@ void QStyleSheetStyle::updateStyleSheetFont(QWidget* w) const
|
|||||||
w->setFont(font);
|
w->setFont(font);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
QFont font = rule.font.resolve(w->font());
|
QFont wf = w->d_func()->localFont();
|
||||||
|
QFont font = rule.font.resolve(wf);
|
||||||
|
font.resolve(wf.resolve() | rule.font.resolve());
|
||||||
|
|
||||||
if ((!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))
|
if ((!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))
|
||||||
&& isNaturalChild(w) && qobject_cast<QWidget *>(w->parent())) {
|
&& isNaturalChild(w) && qobject_cast<QWidget *>(w->parent())) {
|
||||||
@ -6041,10 +6043,11 @@ void QStyleSheetStyle::updateStyleSheetFont(QWidget* w) const
|
|||||||
font = font.resolve(static_cast<QWidget *>(w->parent())->font());
|
font = font.resolve(static_cast<QWidget *>(w->parent())->font());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (w->data->fnt == font)
|
if (wf.resolve() == font.resolve() && wf == font)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
w->data->fnt = font;
|
w->data->fnt = font;
|
||||||
|
w->d_func()->directFontResolveMask = font.resolve();
|
||||||
|
|
||||||
QEvent e(QEvent::FontChange);
|
QEvent e(QEvent::FontChange);
|
||||||
QApplication::sendEvent(w, &e);
|
QApplication::sendEvent(w, &e);
|
||||||
|
@ -166,6 +166,7 @@ private slots:
|
|||||||
void getSetCheck();
|
void getSetCheck();
|
||||||
void fontPropagation();
|
void fontPropagation();
|
||||||
void fontPropagation2();
|
void fontPropagation2();
|
||||||
|
void fontPropagation3();
|
||||||
void palettePropagation();
|
void palettePropagation();
|
||||||
void palettePropagation2();
|
void palettePropagation2();
|
||||||
void enabledPropagation();
|
void enabledPropagation();
|
||||||
@ -819,6 +820,18 @@ void tst_QWidget::fontPropagation2()
|
|||||||
QVERIFY(child5->font().italic());
|
QVERIFY(child5->font().italic());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QWidget::fontPropagation3()
|
||||||
|
{
|
||||||
|
QWidget parent;
|
||||||
|
QWidget *child = new QWidget(&parent);
|
||||||
|
parent.setFont(QFont("Monospace", 9));
|
||||||
|
QImage image(32, 32, QImage::Format_RGB32);
|
||||||
|
QPainter p(&image);
|
||||||
|
p.setFont(child->font());
|
||||||
|
QCOMPARE(p.font().family(), child->font().family());
|
||||||
|
QCOMPARE(p.font().pointSize(), child->font().pointSize());
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QWidget::palettePropagation()
|
void tst_QWidget::palettePropagation()
|
||||||
{
|
{
|
||||||
QScopedPointer<QWidget> testWidget(new QWidget);
|
QScopedPointer<QWidget> testWidget(new QWidget);
|
||||||
|
@ -741,9 +741,9 @@ void tst_QStyleSheetStyle::fontPropagation()
|
|||||||
QCOMPARE(FONTSIZE(pb), 20);
|
QCOMPARE(FONTSIZE(pb), 20);
|
||||||
|
|
||||||
QWidget window;
|
QWidget window;
|
||||||
window.setStyleSheet("* { font-size: 10pt }");
|
window.setStyleSheet("* { font-size: 9pt }");
|
||||||
pb.setParent(&window);
|
pb.setParent(&window);
|
||||||
QCOMPARE(FONTSIZE(pb), 10);
|
QCOMPARE(FONTSIZE(pb), 9);
|
||||||
window.setStyleSheet("");
|
window.setStyleSheet("");
|
||||||
QCOMPARE(FONTSIZE(pb), buttonFontSize);
|
QCOMPARE(FONTSIZE(pb), buttonFontSize);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user