diff options
author | Zhang Hao <zhanghao@uniontech.com> | 2021-07-23 15:39:57 +0800 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2021-08-23 12:39:44 +0000 |
commit | d2670601890a188e2d083460b6e65f9df1e8f6fe (patch) | |
tree | 6051cce15e0e24859c04291c6840c36d3bb3c1f3 /src | |
parent | e4d62651c278c468f71ce097979bc1183ffd0713 (diff) |
QLineEdit: account for the placeholderText when computing lineRect
If in a QLineEdit the placeholderText uses e.g. Tibetan language, then the
height of font as reported by QFontMetrics might be less than the height
of the boundingRect calculated for the placeholderText. This can cause the
placeholderText to display incompletely.
Fix this by using QFontMetrics::boundingRect instead of QFontMetrics::height
when computing lineRect.
Fixes: QTBUG-95341
Pick-to: 5.15 6.1 6.2
Change-Id: I9eef35fd89c5c1d79f6dd703355634d6905ca967
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/widgets/widgets/qlineedit.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index 9422736666..1911620f42 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -1993,21 +1993,28 @@ void QLineEdit::paintEvent(QPaintEvent *) p.setClipRect(r); QFontMetrics fm = fontMetrics(); + int fmHeight = 0; + if (d->shouldShowPlaceholderText()) + fmHeight = fm.boundingRect(d->placeholderText).height(); + else + fmHeight = fm.boundingRect(d->control->text() + d->control->preeditAreaText()).height(); + fmHeight = qMax(fmHeight, fm.height()); + Qt::Alignment va = QStyle::visualAlignment(d->control->layoutDirection(), QFlag(d->alignment)); switch (va & Qt::AlignVertical_Mask) { case Qt::AlignBottom: - d->vscroll = r.y() + r.height() - fm.height() - QLineEditPrivate::verticalMargin; + d->vscroll = r.y() + r.height() - fmHeight - QLineEditPrivate::verticalMargin; break; case Qt::AlignTop: d->vscroll = r.y() + QLineEditPrivate::verticalMargin; break; default: //center - d->vscroll = r.y() + (r.height() - fm.height() + 1) / 2; + d->vscroll = r.y() + (r.height() - fmHeight + 1) / 2; break; } QRect lineRect(r.x() + QLineEditPrivate::horizontalMargin, d->vscroll, - r.width() - 2 * QLineEditPrivate::horizontalMargin, fm.height()); + r.width() - 2 * QLineEditPrivate::horizontalMargin, fmHeight); if (d->shouldShowPlaceholderText()) { if (!d->placeholderText.isEmpty()) { |