From a7123de6c99b4949fb1b3affffcba3bf9a9d372f Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Fri, 1 Feb 2019 20:06:24 +0100 Subject: QFontComboBox: fix layouting in RTL mode QFontComboBox did not work very well in RTL mode. The text was not aligned right and the icon was not painted on the right side as it is done for a normal combobox. Fix it by using QStyle::alignedRect() for the icon position calculation and passing the correct alignment when drawing text. Fixes: QTBUG-19722 Change-Id: I47c5864519e78e0833ef4c07a1385e45ce4479f8 Reviewed-by: Richard Moe Gustavsen --- src/widgets/widgets/qfontcombobox.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src/widgets') diff --git a/src/widgets/widgets/qfontcombobox.cpp b/src/widgets/widgets/qfontcombobox.cpp index 957a464b71..4a99b0f962 100644 --- a/src/widgets/widgets/qfontcombobox.cpp +++ b/src/widgets/widgets/qfontcombobox.cpp @@ -236,9 +236,10 @@ void QFontFamilyDelegate::paint(QPainter *painter, if (QFontDatabase().isSmoothlyScalable(text)) { icon = &truetype; } - QSize actualSize = icon->actualSize(r.size()); - - icon->paint(painter, r, Qt::AlignLeft|Qt::AlignVCenter); + const QSize actualSize = icon->actualSize(r.size()); + const QRect iconRect = QStyle::alignedRect(option.direction, option.displayAlignment, + actualSize, r); + icon->paint(painter, iconRect, Qt::AlignLeft|Qt::AlignVCenter); if (option.direction == Qt::RightToLeft) r.setRight(r.right() - actualSize.width() - 4); else @@ -247,6 +248,7 @@ void QFontFamilyDelegate::paint(QPainter *painter, QFont old = painter->font(); painter->setFont(font); + const Qt::Alignment textAlign = QStyle::visualAlignment(option.direction, option.displayAlignment); // If the ascent of the font is larger than the height of the rect, // we will clip the text, so it's better to align the tight bounding rect in this case // This is specifically for fonts where the ascent is very large compared to @@ -254,9 +256,11 @@ void QFontFamilyDelegate::paint(QPainter *painter, QFontMetricsF fontMetrics(font); if (fontMetrics.ascent() > r.height()) { QRectF tbr = fontMetrics.tightBoundingRect(text); - painter->drawText(r.x(), r.y() + (r.height() + tbr.height()) / 2.0, text); + QRect textRect(r); + textRect.setHeight(textRect.height() + (r.height() - tbr.height())); + painter->drawText(textRect, Qt::AlignBottom|Qt::TextSingleLine|textAlign, text); } else { - painter->drawText(r, Qt::AlignVCenter|Qt::AlignLeading|Qt::TextSingleLine, text); + painter->drawText(r, Qt::AlignVCenter|Qt::TextSingleLine|textAlign, text); } if (writingSystem != QFontDatabase::Any) @@ -270,7 +274,7 @@ void QFontFamilyDelegate::paint(QPainter *painter, r.setRight(r.right() - w); else r.setLeft(r.left() + w); - painter->drawText(r, Qt::AlignVCenter|Qt::AlignLeading|Qt::TextSingleLine, sample); + painter->drawText(r, Qt::AlignVCenter|Qt::TextSingleLine|textAlign, sample); } painter->setFont(old); -- cgit v1.2.3