如何让QLineEdit仅显示最后输入的字符数秒后转为密码掩码?
实现QLineEdit自定义密码回显(最后输入字符短暂可见)
我们需要实现的效果是:密码输入框默认隐藏所有字符,但最后输入的字符会保持可见状态数秒,之后自动替换为圆点,方便用户确认输入的内容是否正确。
实现思路
- 自定义继承自
QLineEdit的类,手动管理真实密码和显示文本,不依赖Qt自带的Password回显模式 - 用定时器控制最后一个输入字符的可见时长,每次输入新字符时重置定时器
- 维护两个核心变量:存储真实密码的字符串,以及用于显示的字符串(大部分为圆点,最后一个为真实字符或圆点)
代码实现
#include <QLineEdit> #include <QTimer> #include <QKeyEvent> #include <QApplication> class CustomPasswordEdit : public QLineEdit { Q_OBJECT public: explicit CustomPasswordEdit(QWidget *parent = nullptr) : QLineEdit(parent), m_visibleDuration(2000) // 默认2秒可见时长 { setEchoMode(QLineEdit::Normal); m_timer = new QTimer(this); connect(m_timer, &QTimer::timeout, this, &CustomPasswordEdit::hideLastChar); } // 获取真实输入的密码 QString getPassword() const { return m_realPassword; } protected: void keyPressEvent(QKeyEvent *event) override { // 处理可打印字符输入 if (event->key() >= Qt::Key_Space && event->key() <= Qt::Key_AsciiTilde) { m_realPassword += event->text(); updateDisplay(false); m_timer->start(m_visibleDuration); } // 处理退格键 else if (event->key() == Qt::Key_Backspace) { if (!m_realPassword.isEmpty()) { m_realPassword.chop(1); updateDisplay(false); m_realPassword.isEmpty() ? m_timer->stop() : m_timer->start(m_visibleDuration); } } // 其他按键交给父类处理 else { QLineEdit::keyPressEvent(event); } } // 支持粘贴操作(可选) void paste() override { QString pastedText = QApplication::clipboard()->text(); if (!pastedText.isEmpty()) { m_realPassword += pastedText; updateDisplay(false); m_timer->start(m_visibleDuration); } } private slots: void hideLastChar() { if (!m_realPassword.isEmpty()) { updateDisplay(true); m_timer->stop(); } } private: void updateDisplay(bool hideLastChar) { int passwordLen = m_realPassword.length(); if (passwordLen == 0) { setText(""); return; } QString displayStr; // 前面的字符全部用圆点填充 displayStr.fill('\u2022', passwordLen - 1); // 最后一个字符:需要隐藏则加圆点,否则加真实字符 displayStr += hideLastChar ? '\u2022' : m_realPassword.last(1); setText(displayStr); } QString m_realPassword; QTimer* m_timer; int m_visibleDuration; // 最后字符可见时长(毫秒) };
关键逻辑说明
- 真实密码与显示分离:
m_realPassword存储用户实际输入的所有内容,显示文本通过updateDisplay动态生成,避免Qt自带模式的限制 - 定时器控制:每次输入新字符时启动/重置定时器,到达设定时长后自动隐藏最后一个可见字符
- 输入事件处理:重写
keyPressEvent处理普通输入和退格操作,可选重写paste()支持粘贴密码的场景 - 自定义可见时长:修改
m_visibleDuration的值可以调整字符保持可见的时间,比如设置为3000即3秒
内容的提问来源于stack exchange,提问作者Pamputt
相关产品推荐
相关产品推荐

