溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Qt如何實現(xiàn)密碼框

發(fā)布時間:2022-06-14 16:41:53 來源:億速云 閱讀:292 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Qt如何實現(xiàn)密碼框”,在日常操作中,相信很多人在Qt如何實現(xiàn)密碼框問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Qt如何實現(xiàn)密碼框”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

密碼輸入框

支持無可選擇,不可復(fù)制,粘貼,可查看密碼,全清除功能

環(huán)境

Qt5.6.2+ Vs2013

效果

Qt如何實現(xiàn)密碼框

代碼

QPasswdLineEdit類

PasswdLineEdit.h

#ifndef PASSWDLINEEDIT_H
#define PASSWDLINEEDIT_H

#include <QLineEdit>
#include <QPushButton>

class QPasswdLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    explicit QPasswdLineEdit(QWidget *parent = nullptr);
    ~QPasswdLineEdit();

    void setCopyAble(bool able);

    void setSelection(bool able);

    void setContextMenu(bool able);

protected:
    bool eventFilter(QObject *watched, QEvent *event);

    private slots:
    void slot_textChanged(const QString& text);

    void slot_show();

    void slot_hide();

    void slot_clear();

private:
    QPushButton* x_pBtnShow;
    QPushButton* x_pBtnHide;
    QPushButton* x_pBtnClear;

    bool x_bCopy;    //能否復(fù)制黏貼
    bool x_bSelection;  //能否能選中
    bool x_bContenx;  //是否存在右鍵菜單

    bool x_bShow;
};

#endif // PASSWDLINEEDIT_H

PasswdLineEdit.cpp

#include "PasswdLineEdit.h"

#include <QEvent>
#include <QKeyEvent>
#include <QPainter>
#include <QHBoxLayout>
#include <QSize>

QPasswdLineEdit::QPasswdLineEdit(QWidget *parent)
    : QLineEdit(parent)
    , x_pBtnShow(nullptr)
    , x_pBtnHide(nullptr)
    , x_pBtnClear(nullptr)
    , x_bCopy(false)
    , x_bSelection(false)
    , x_bContenx(false)
    , x_bShow(false)
{
    x_pBtnShow = new QPushButton(this);
    x_pBtnHide = new QPushButton(this);
    x_pBtnClear = new QPushButton(this);

    setStyleSheet("QPushButton{border:none;}");

    QPixmap _pixClear(":/image/clear");
    x_pBtnClear->setIcon(_pixClear);
    x_pBtnClear->setIconSize(_pixClear.size());
    x_pBtnClear->setCursor(Qt::PointingHandCursor);
    x_pBtnClear->setToolTip(QString::fromLocal8Bit("清理"));

    QPixmap _pixShow(":/image/show");
    x_pBtnShow->setIcon(_pixShow);
    x_pBtnShow->setIconSize(_pixShow.size());
    x_pBtnShow->setCursor(Qt::PointingHandCursor);
    x_pBtnShow->setToolTip(QString::fromLocal8Bit("查看密碼"));

    QPixmap _pixHide(":/image/hide");
    x_pBtnHide->setIcon(_pixHide);
    x_pBtnHide->setIconSize(_pixHide.size());
    x_pBtnHide->setCursor(Qt::PointingHandCursor);
    x_pBtnHide->setToolTip(QString::fromLocal8Bit("隱藏密碼"));

    QHBoxLayout* _pHLayout = new QHBoxLayout();

    _pHLayout->addStretch();
    _pHLayout->addWidget(x_pBtnShow);
    _pHLayout->addWidget(x_pBtnHide);
    _pHLayout->addWidget(x_pBtnClear);

    _pHLayout->setMargin(0);
    _pHLayout->setSpacing(0);

    x_pBtnShow->hide();
    x_pBtnHide->hide();
    x_pBtnClear->hide();

    this->setLayout(_pHLayout);

    this->setTextMargins(1, 1, 1, 1);

    setFixedHeight(30);

    //密碼顯示模式
    setEchoMode(QLineEdit::Password);

    if (x_bContenx)
    {
        this->setContextMenuPolicy(Qt::DefaultContextMenu);
    }
    else
    {
        this->setContextMenuPolicy(Qt::NoContextMenu);
    }

    this->installEventFilter(this);

    connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(slot_textChanged(const QString&)));

    connect(x_pBtnShow, SIGNAL(clicked()), this, SLOT(slot_show()));
    connect(x_pBtnHide, SIGNAL(clicked()), this, SLOT(slot_hide()));
    connect(x_pBtnClear, SIGNAL(clicked()), this, SLOT(slot_clear()));
}

QPasswdLineEdit::~QPasswdLineEdit()
{

}

void QPasswdLineEdit::setCopyAble(bool able)
{
    x_bCopy = able;
}

void QPasswdLineEdit::setSelection(bool able)
{
    x_bSelection = able;
}

void QPasswdLineEdit::setContextMenu(bool able)
{
    x_bContenx = able;

    if (x_bContenx)
    {
        this->setContextMenuPolicy(Qt::DefaultContextMenu);
    }
    else
    {
        this->setContextMenuPolicy(Qt::NoContextMenu);
    }
}


bool QPasswdLineEdit::eventFilter(QObject *watched, QEvent *event)
{
    QPasswdLineEdit* _pObj = qobject_cast<QPasswdLineEdit*>(watched);

    if (_pObj == this)
    {
        switch (event->type())
        {
        case QEvent::MouseMove:
        case QEvent::MouseButtonDblClick:
            return !x_bSelection;
            break;
        case QEvent::MouseButtonPress:
            {
                QMouseEvent* _pMouseEvent = static_cast<QMouseEvent*>(event);

                if (_pMouseEvent->button() == Qt::RightButton)
                {
                    return !x_bContenx;
                }
            }
            break;
        default:
            break;
        }
    }

    return QLineEdit::eventFilter(watched, event);
}

void QPasswdLineEdit::slot_textChanged(const QString& text)
{
    if (!text.isEmpty())
    {
        setTextMargins(1, 1, 36, 1);

        if (x_bShow)
        {
            x_pBtnShow->hide();
            x_pBtnHide->show();
        }
        else
        {
            x_pBtnShow->show();
            x_pBtnHide->hide();
        }

        x_pBtnClear->show();
    }
    else
    {
        x_pBtnShow->hide();
        x_pBtnHide->hide();
        x_pBtnClear->hide();

        x_bShow = false;
        setEchoMode(QLineEdit::Password);

        this->setTextMargins(1, 1, 1, 1);
    }
}

void QPasswdLineEdit::slot_show()
{
    x_bShow = true;

    setEchoMode(QLineEdit::Normal);

    x_pBtnShow->hide();
    x_pBtnHide->show();
}

void QPasswdLineEdit::slot_hide()
{
    setEchoMode(QLineEdit::Password);

    x_pBtnShow->show();
    x_pBtnHide->hide();
}

void QPasswdLineEdit::slot_clear()
{
    clear();
}

使用

x_pPsdEdit = new QPasswdLineEdit(this);
QGridLayout* _pGLayout = new QGridLayout();
_pGLayout->addWidget(x_pPsdEdit);
setLayout(_pGLayout);

到此,關(guān)于“Qt如何實現(xiàn)密碼框”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI