Fix the size calculation of QHeaderView when stylesheet is used

When calculating the header section size based on its contents when a
stylesheet is used, the size hints from the stylesheet are used. In case
if the stylesheet specifies only one of the sizes, the other is set to
-1. Because of this the actual content size is ignored.

The solution is to calculate the size based on the application style, in
case if it's not specified in the stylesheet.

Fixes: QTBUG-75615
Change-Id: I3453fa623d75b6b32832edf753de6e3e4e7f5a22
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
This commit is contained in:
Sona Kurazyan 2019-10-11 10:49:38 +02:00
parent 139246faa3
commit ffac899576
2 changed files with 29 additions and 0 deletions

View File

@ -5035,6 +5035,14 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op
QRenderRule subRule = renderRule(w, opt, PseudoElement_HeaderViewSection);
if (subRule.hasGeometry() || subRule.hasBox() || !subRule.hasNativeBorder() || subRule.hasFont) {
sz = subRule.adjustSize(csz);
if (!sz.isValid()) {
// Try to set the missing values based on the base style.
const auto baseSize = baseStyle()->sizeFromContents(ct, opt, sz, w);
if (sz.width() < 0)
sz.setWidth(baseSize.width());
if (sz.height() < 0)
sz.setHeight(baseSize.height());
}
if (!subRule.hasGeometry()) {
QSize nativeContentsSize;
bool nullIcon = hdr->icon.isNull();

View File

@ -216,6 +216,7 @@ private slots:
void QTBUG14242_hideSectionAutoSize();
void QTBUG50171_visualRegionForSwappedItems();
void QTBUG53221_assertShiftHiddenRow();
void QTBUG75615_sizeHintWithStylesheet();
void ensureNoIndexAtLength();
void offsetConsistent();
@ -2606,6 +2607,26 @@ void tst_QHeaderView::QTBUG53221_assertShiftHiddenRow()
QCOMPARE(tableView.verticalHeader()->isSectionHidden(2), true);
}
void tst_QHeaderView::QTBUG75615_sizeHintWithStylesheet()
{
QTableView tableView;
QStandardItemModel model(1, 1);
tableView.setModel(&model);
tableView.show();
const auto headerView = tableView.horizontalHeader();
const auto oldSizeHint = headerView->sizeHint();
QVERIFY(oldSizeHint.isValid());
tableView.setStyleSheet("QTableView QHeaderView::section { height: 100px;}");
QCOMPARE(headerView->sizeHint().width(), oldSizeHint.width());
QCOMPARE(headerView->sizeHint().height(), 100);
tableView.setStyleSheet("QTableView QHeaderView::section { width: 100px;}");
QCOMPARE(headerView->sizeHint().height(), oldSizeHint.height());
QCOMPARE(headerView->sizeHint().width(), 100);
}
void protected_QHeaderView::testVisualRegionForSelection()
{
QRegion r = visualRegionForSelection(QItemSelection(model()->index(1, 0), model()->index(1, 2)));