From 4d943846128118e1b9932a17ce6f977a0f4127a5 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sun, 6 Dec 2020 14:09:26 +0100 Subject: [PATCH] QHeaderView: respect the font role while calculating the elided text The font role in the header view was not taken into account when the text for an item should be elided. This leads to a wrongly elided text esp. visible when the font size is different to the font of QHeaderView. Fix it by passing the elide mode to the style since only the style knows the used font (e.g. bold or not bold) and available rect. This is now in sync with CE_ItemViewItem where the eliding is also done by the style and not by the item view. [ChangeLog][QtWidgets][QHeaderView] QStyleOptionHeader got a new member textElideMode. Fixes: QTBUG-86426 Change-Id: If6914fe5aaa5d285e6da55d2129f9249d90da3d7 Reviewed-by: Richard Moe Gustavsen --- qtbase.pro | 2 ++ src/widgets/itemviews/qheaderview.cpp | 9 +++++---- src/widgets/styles/qcommonstyle.cpp | 9 ++++++++- src/widgets/styles/qstyleoption.cpp | 8 ++------ src/widgets/styles/qstyleoption.h | 4 +++- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/qtbase.pro b/qtbase.pro index 59d8d958a3f..4f1871fe0a6 100644 --- a/qtbase.pro +++ b/qtbase.pro @@ -1,3 +1,5 @@ + + ##################################################################### # Main projectfile ##################################################################### diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index becf1e1a247..d6c9700ed31 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -2952,10 +2952,11 @@ void QHeaderView::initStyleOptionForIndex(QStyleOptionHeader *option, int logica margin += style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, this) + style()->pixelMetric(QStyle::PM_HeaderMargin, nullptr, this); - if (d->textElideMode != Qt::ElideNone) { - const QRect textRect = style()->subElementRect(QStyle::SE_HeaderLabel, &opt, this); - opt.text = opt.fontMetrics.elidedText(opt.text, d->textElideMode, textRect.width() - margin); - } + QVariant var = d->model->headerData(logicalIndex, d->orientation, + Qt::FontRole); + if (var.isValid() && var.canConvert()) + opt.fontMetrics = QFontMetrics(qvariant_cast(var)); + opt.textElideMode = d->textElideMode; QVariant foregroundBrush = d->model->headerData(logicalIndex, d->orientation, Qt::ForegroundRole); diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index fad02d5ae99..54489c6379e 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -1659,13 +1659,20 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, else rect.setRight(rect.right() - pixw - margin); } + QFontMetrics fm(header->fontMetrics); if (header->state & QStyle::State_On) { QFont fnt = p->font(); fnt.setBold(true); p->setFont(fnt); + fm = QFontMetrics((p->font())); } + QString text; + if (header->textElideMode != Qt::ElideNone) + text = fm.elidedText(header->text, header->textElideMode, rect.width()); + else + text = header->text; proxy()->drawItemText(p, rect, header->textAlignment, header->palette, - (header->state & State_Enabled), header->text, QPalette::ButtonText); + header->state.testFlag(State_Enabled), text, QPalette::ButtonText); } break; #if QT_CONFIG(toolbutton) diff --git a/src/widgets/styles/qstyleoption.cpp b/src/widgets/styles/qstyleoption.cpp index c69aac11bb8..5bb5cca8b84 100644 --- a/src/widgets/styles/qstyleoption.cpp +++ b/src/widgets/styles/qstyleoption.cpp @@ -739,11 +739,7 @@ QStyleOptionGroupBox::QStyleOptionGroupBox(int version) */ QStyleOptionHeader::QStyleOptionHeader() - : QStyleOption(QStyleOptionHeader::Version, SO_Header), - section(0), textAlignment(Qt::AlignLeft), iconAlignment(Qt::AlignLeft), - position(QStyleOptionHeader::Beginning), - selectedPosition(QStyleOptionHeader::NotAdjacent), sortIndicator(None), - orientation(Qt::Horizontal) + : QStyleOptionHeader(QStyleOptionHeader::Version) { } @@ -755,7 +751,7 @@ QStyleOptionHeader::QStyleOptionHeader(int version) section(0), textAlignment(Qt::AlignLeft), iconAlignment(Qt::AlignLeft), position(QStyleOptionHeader::Beginning), selectedPosition(QStyleOptionHeader::NotAdjacent), sortIndicator(None), - orientation(Qt::Horizontal) + orientation(Qt::Horizontal), textElideMode(Qt::ElideNone), unused(0) { } diff --git a/src/widgets/styles/qstyleoption.h b/src/widgets/styles/qstyleoption.h index 38e70e2078b..4998d8cf14e 100644 --- a/src/widgets/styles/qstyleoption.h +++ b/src/widgets/styles/qstyleoption.h @@ -219,7 +219,9 @@ public: SectionPosition position; SelectedPosition selectedPosition; SortIndicator sortIndicator; - Qt::Orientation orientation; + Qt::Orientation orientation:2; + Qt::TextElideMode textElideMode:2; + int unused:28; QStyleOptionHeader(); QStyleOptionHeader(const QStyleOptionHeader &other) : QStyleOption(Version, Type) { *this = other; }