Qt密码框
忆秋年jd 人气:0密码输入框
支持无可选择,不可复制,粘贴,可查看密码,全清除功能
环境
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_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);
加载全部内容