Qt實現(xiàn)密碼框
更新時間:2022年06月14日 14:18:04 作者:憶秋年jd
這篇文章主要為大家詳細介紹了Qt實現(xiàn)密碼框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Qt實現(xiàn)密碼框的具體代碼,供大家參考,具體內(nèi)容如下
密碼輸入框
支持無可選擇,不可復制,粘貼,可查看密碼,全清除功能
環(huán)境
Qt5.6.2+ Vs2013
效果

代碼
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;?? ?//能否復制黏貼
?? ?bool x_bSelection; ?//能否能選中
?? ?bool x_bContenx; ?//是否存在右鍵菜單
?? ?bool x_bShow;
};
#endif // PASSWDLINEEDIT_HPasswdLineEdit.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);
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++ Vector 動態(tài)數(shù)組的實現(xiàn)
這篇文章主要介紹了C++ Vector 動態(tài)數(shù)組的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01
C語言詳盡圖解函數(shù)棧幀的創(chuàng)建和銷毀實現(xiàn)
我們知道c語言中函數(shù)都是被調(diào)用的,main函數(shù)里面能調(diào)用其他函數(shù),其實main函數(shù)也是被別的函數(shù)調(diào)用的,下面通過本文給大家分享c語言函數(shù)棧幀的創(chuàng)建和銷毀過程,一起看看吧2022-05-05

