Qt之密码框

文章目录

  • 密码输入框
  • 环境
  • 效果
  • 代码
  • 使用

密码输入框

支持无可选择,不可复制,粘贴,可查看密码,全清除功能

环境

Qt5.6.2+ Vs2013

效果

Qt之密码框_第1张图片

代码

QPasswdLineEdit类
PasswdLineEdit.h

#ifndef PASSWDLINEEDIT_H
#define PASSWDLINEEDIT_H

#include 
#include 

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 
#include 
#include 
#include 
#include 

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(watched);

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

你可能感兴趣的:(Qt)