Qt实现密码框

本文实例为大家分享了Qt实现密码框的具体代码,供大家参考,具体内容如下

密码输入框

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

环境

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Qt实现解压带有密码的加密文件

    目录 1.指定zip压缩包状态 2.创建解压文件 3.获取实际的压缩数量 4.遍历方式创建解压缩文件 4.1设置解压文件的参数 4.2以读的方式打开加密文件 4.3获取当前文件的所有内容 4.4创建解压缩后的同名文件 5.关闭zip压缩包 上一章节中介绍了如何使用Qt编译quazip库以及对文件加解密的简单应用,那么,今天我们继续深挖关于解密操作的功能吧! 简单的解密一个压缩包,可以使用#include "JlCompress.h"中的函数进行静态操作.如果你只是需要简单的应用那么,这

  • Qt编写显示密码强度的控件

    本文实例为大家分享了Qt编写显示密码强度控件的具体代码,供大家参考,具体内容如下 代码: #ifndef WIDGET_H #define WIDGET_H   #include <QWidget> #include <QRegularExpression> #include <QTimer>   class PasswordStrengthCheck : public QWidget {     Q_OBJECT   public:     PasswordStren

  • Qt实现密码框

    本文实例为大家分享了Qt实现密码框的具体代码,供大家参考,具体内容如下 密码输入框 支持无可选择,不可复制,粘贴,可查看密码,全清除功能 环境 Qt5.6.2+ Vs2013 效果 代码 QPasswdLineEdit类 PasswdLineEdit.h #ifndef PASSWDLINEEDIT_H #define PASSWDLINEEDIT_H #include <QLineEdit> #include <QPushButton> class QPasswdLineEdit

  • angular仿支付宝密码框输入效果

    项目需求,使用ng写一个密码框格子支付模块,一开始使用一个input+letter-spacing来分割字符,但是发现间距非常不好控制,随着字符的输入文本框字符串间距还会自动调整.最终从网上查找到一款jq仿支付宝密码输入框,于是我模仿编写了个指令模块. 效果如下: 完整代码如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <met

  • JS实现密码框的显示密码和隐藏密码功能示例

    本文实例讲述了JS实现密码框的显示密码和隐藏密码功能.分享给大家供大家参考,具体如下: 运行效果图如下: 完整实例代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form method="POST" action="

  • js正则实现的密码框简单制作,还可以替换成自己想用得符号

    密码框简单制作,还可以替换成自己想用得符号. <style type="text/css"> #c { position: relative; } #a { position: absolute; left: 0; top: 0; font-size: 12px; font-family: 宋体; } #b { position: absolute; left: 0; top: 0; font-size: 12px; font-family: 宋体; -moz-opacit

  • js实现input密码框提示信息的方法(附html5实现方法)

    本文实例讲述了js实现input密码框提示信息的方法.分享给大家供大家参考,具体如下: 今天我们主管说要在密码框加入个"请输入密码"的提示信息,第一次的时候本来想着用修改input  type 属性的方法呢,结果有某些特别的浏览器不支持,IE的input的type属性是只读的,不能动态设置.所以换其它的方法,实例如下: <input type="text" onfocus="changeTip(this);" id="passTe

  • JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果

    本文实例讲述了JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果.分享给大家供大家参考,具体如下: 思路: 1.首先用把密码框用txt暂时替代,并赋上默认值 <input type="text" value="请输入密码" /> 2.当文本框获取焦点后,把默认值清空,把type改为password. 3.当文本框失去焦点后,把type改为txt,把默认值设为"请输入密码". JS代码: window.onload=functi

  • JavaScript实现输入框(密码框)出现提示语

    有时候我们需要在登陆表单有一些提示语言,比如"请输入用户名"和"请输入密码"等语言,至于用户名好说,但是在密码框中出现"请输入密码"这样的语言就有点麻烦了,因为在密码框输入的内容不会以明码显示.如果动态的控制type属性的话就有兼容性问题,如果input已经存在于页面中的话,在IE8和IE8以下浏览器中,type属性是只读的.所以就得想其他办法,代码如下: <!DOCTYPE html> <html> <head&g

  • JavaScript如何实现在文本框(密码框)输入提示语

    有时候我们需要在登陆表单有一些提示语言,比如"请输入用户名"和"请输入密码"等语言,至于用户名好说,但是在密码框中出现"请输入密码"这样的语言就有点麻烦了,因为在密码框输入的内容不会以明码显示.如果动态的控制type属性的话就有兼容性问题,如果input已经存在于页面中的话,在IE8和IE8以下浏览器中,type属性是只读的.所以就得想其他办法,代码如下: <!DOCTYPE html> <html> <head&g

  • 基于JS实现密码框(password)中显示文字提示功能代码

    其实实际上实现中并不能让password中显示文字提示,但是我们在工作中有这样的需求,当没输入东西的时候,框内有提示输入密码,但是当输入东西的时候又显示的是*号,那么是如何实现的呢?其实原理很简单,就是放两个文本框,样式以及定位都是一样的.先将type为password的隐藏,只显示type为text的伪密码框,value设置提示内容例如请输入密码.然后当input触发的时候,type为text的input隐藏,让type为password的input显示出来.然后当检测password的val

  • Android 开发仿简书登录框可删除内容或显示密码框的内容

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedittextdemo; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.text.Editable; impor

随机推荐