StyleSheet: respect a font weight set for header sections

QCommonStyle sets the font for a selected header section to bold.
This overrides the font weight a calling style might already have set,
e.g. when a style sheet is applied to explicitly set a weight for a
checked header section:

QHeaderView::section:checked {
   font-size: 20px
   font-weight: normal
}

Since setting the weight on a font sets the respective resolve-mask
bit, we can avoid overwriting a weight that is already set explicitly.

Add baseline test coverage using a QTableWidget.

Fixes: QTBUG-122180
Pick-to: 6.5
Change-Id: I8c6279ad2fd8c5718ebea26e27c64ae823625748
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
(cherry picked from commit 74e0ed217fdec8e32227f9f845eccac7f1552297)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Volker Hilsheimer 2024-04-10 15:25:59 +02:00 committed by Qt Cherry-pick Bot
parent 9dd7e09c9b
commit 294a2646db
3 changed files with 41 additions and 3 deletions

View File

@ -1679,9 +1679,12 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
QFontMetrics fm(header->fontMetrics);
if (header->state & QStyle::State_On) {
QFont fnt = p->font();
fnt.setBold(true);
p->setFont(fnt);
fm = QFontMetrics((p->font()));
// the font already has a weight set; don't override that
if (!(fnt.resolveMask() & QFont::WeightResolved)) {
fnt.setBold(true);
p->setFont(fnt);
fm = QFontMetrics((p->font()));
}
}
QString text = header->text;
if (const QStyleOptionHeaderV2 *headerV2 = qstyleoption_cast<const QStyleOptionHeaderV2 *>(header)) {

View File

@ -0,0 +1,16 @@
QHeaderView::section {
background-color: red;
font-size: 10px;
}
QHeaderView::section:checked {
background-color: green;
font-size: 20px;
font-weight: bold;
}
QHeaderView::section:first {
background-color: yellow;
font-size: 20px;
font-weight: normal;
}

View File

@ -27,6 +27,9 @@ private slots:
void tst_QTreeView_data();
void tst_QTreeView();
void tst_QHeaderView_data();
void tst_QHeaderView();
private:
QDir styleSheetDir;
};
@ -205,6 +208,22 @@ void tst_Stylesheet::tst_QTreeView()
QBASELINE_CHECK_DEFERRED(takeSnapshot(), "itemSelected");
}
void tst_Stylesheet::tst_QHeaderView_data()
{
loadTestFiles();
}
void tst_Stylesheet::tst_QHeaderView()
{
QHBoxLayout *layout = new QHBoxLayout;
QTableWidget *tw = new QTableWidget(10, 10);
tw->setCurrentCell(1, 1);
layout->addWidget(tw);
testWindow()->setLayout(layout);
makeVisible();
QBASELINE_TEST(takeSnapshot());
}
#define main _realmain
QTEST_MAIN(tst_Stylesheet)
#undef main