You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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; // 最后字符可见时长(毫秒)
};

关键逻辑说明

  1. 真实密码与显示分离:m_realPassword存储用户实际输入的所有内容,显示文本通过updateDisplay动态生成,避免Qt自带模式的限制
  2. 定时器控制:每次输入新字符时启动/重置定时器,到达设定时长后自动隐藏最后一个可见字符
  3. 输入事件处理:重写keyPressEvent处理普通输入和退格操作,可选重写paste()支持粘贴密码的场景
  4. 自定义可见时长:修改m_visibleDuration的值可以调整字符保持可见的时间,比如设置为3000即3秒

内容的提问来源于stack exchange,提问作者Pamputt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:53:16