Qt实现密码框

 更新时间:2022年06月14日 14:18:04   作者:忆秋年jd  
这篇文章主要为大家详细介绍了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);

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

相关文章

  • C++ STL中的常用遍历算法分享

    C++ STL中的常用遍历算法分享

    这篇文章主要为大家详细介绍了C++ STL中两个常用的遍历算法,文中的示例代码讲解详细,具有一定的学习与借鉴价值,感兴趣的小伙伴可以参考一下
    2022-12-12
  • C语言中lseek()函数和fseek()函数的使用详解

    C语言中lseek()函数和fseek()函数的使用详解

    这篇文章主要介绍了C语言中lseek()函数和fseek()函数的使用详解,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C语言进阶:指针的进阶(4)

    C语言进阶:指针的进阶(4)

    这篇文章主要介绍了C语言指针详解及用法示例,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下
    2021-09-09
  • C语言实现十六进制转换为十进制的方法详解

    C语言实现十六进制转换为十进制的方法详解

    这篇文章主要为大家详细介绍了C语言实现十六进制转换为十进制的方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-11-11
  • C语言示例讲解结构体的声明与初始化方法

    C语言示例讲解结构体的声明与初始化方法

    结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量。本文将通过示例为大家详细讲讲C语言中结构体的使用,需要的可以参考一下
    2022-07-07
  • C语言解读数组循环右移问题

    C语言解读数组循环右移问题

    这篇文章主要介绍了C语言解读数组循环右移问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • c++对象内存布局示例详解

    c++对象内存布局示例详解

    C++类的内存布局跟结构体有点像,实际上,类中成员变量的内存布局规则跟结构体是一样的,区别在于函数,虚函数的放置,下面这篇文章主要给大家介绍了关于c++对象内存布局的相关资料,需要的朋友可以参考下
    2021-10-10
  • C++实现统计代码运行时间计时器的简单实例

    C++实现统计代码运行时间计时器的简单实例

    这篇文章主要介绍了 C++实现统计代码运行时间计时器的简单实例的相关资料,需要的朋友可以参考下
    2017-07-07
  • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    这篇文章主要介绍了stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列),需要的朋友可以参考下
    2014-05-05
  • VSCode之CMake使用小结

    VSCode之CMake使用小结

    本文主要介绍了VSCode之CMake使用小结,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03

最新评论