From ee3bc863c5f06d61030f23314de8d0ff9522a757 Mon Sep 17 00:00:00 2001 From: zhangkun2 Date: Fri, 7 Aug 2026 20:38:35 +0800 Subject: [PATCH] fix: keep placeholder within text margins MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Elide and draw placeholder within QLineEdit rect minus textMargins 2. Map QLineEdit to DLineEditEx via le->mapTo(this, QPoint(0,0)) 3. Fixes overlap with caps-lock, password and hint icons on lock/login Log: Fixed password prompt overlapping icons on lock and login screens Influence: 1. Lock/login: long password hint elided, not overlapping the icons 2. caps-lock/show-password/hint icons stay clear of placeholder 3. Regression: short Chinese placeholder centered, no anomaly 4. Shared DLineEditEx inputs (account/single/ukey) show placeholder ok fix: 将占位符约束在文本边距内 1. 将 DLineEditEx::paintEvent() 中占位符的省略与绘制约束到扣除内嵌 QLineEdit 的 textMargins() 后的文本可用矩形内,不再使用整框 rect() 2. 通过 le->mapTo(this, QPoint(0,0)) 将内嵌 QLineEdit 坐标映射到 DLineEditEx 绘制坐标系,避免父子控件坐标换算导致省略宽度偏差 3. 修复锁屏/登录界面长错误或提示占位符与大写、显示密码、密码提示 图标重叠的问题 Log: 修复锁屏/登录界面密码提示文案省略后仍与图标重叠的问题 Influence: 1. 锁屏/登录界面:英文 locale 或调大字号/缩放下,设较长密码提示, 输错密码后清空密码框,确认占位符省略后止于左右图标内侧、不再重叠 2. 确认大写、显示密码、密码提示图标与占位符区域保持独立 3. 回归:中文短文案占位符居中显示正常、无视觉异常 4. 共用 DLineEditEx 的账号/单因子/ukey 输入框占位符显示正常 PMS: BUG-351887 --- src/widgets/dlineeditex.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/widgets/dlineeditex.cpp b/src/widgets/dlineeditex.cpp index 94b821a4..5f13ef50 100644 --- a/src/widgets/dlineeditex.cpp +++ b/src/widgets/dlineeditex.cpp @@ -160,8 +160,16 @@ void DLineEditEx::paintEvent(QPaintEvent *event) // 使用 elidedText 确保文本过长时在右侧显示省略号,而不是换行 QFontMetrics fm(pa.font()); const QString &placeholderText = lineEdit()->placeholderText(); - QString elidedText = fm.elidedText(placeholderText, Qt::ElideRight, rect().width()); - pa.drawText(rect(), Qt::AlignCenter | Qt::TextSingleLine, elidedText); + // 将 placeholder 的省略与绘制约束到扣除内嵌 QLineEdit 的 textMargins() + // 后的文本可用矩形内,避免长 placeholder 与左右功能图标重叠。 + // DLineEditEx(QFrame) 与内嵌 QLineEdit 存在父子控件偏移,需用 mapTo + // 将 QLineEdit 坐标系映射到 DLineEditEx 绘制坐标系。 + QLineEdit *le = lineEdit(); + const QMargins tm = le->textMargins(); + const QRect lineEditRect(le->mapTo(this, QPoint(0, 0)), le->size()); + const QRect textRect = lineEditRect.adjusted(tm.left(), tm.top(), -tm.right(), -tm.bottom()); + QString elidedText = fm.elidedText(placeholderText, Qt::ElideRight, textRect.width()); + pa.drawText(textRect, Qt::AlignCenter | Qt::TextSingleLine, elidedText); // 当文本被省略时,设置 tooltip 显示完整文本 if (elidedText != placeholderText) {