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

本文实例为大家分享了Qt编写显示密码强度控件的具体代码,供大家参考,具体内容如下

代码:

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QRegularExpression>
#include <QTimer>
 
class PasswordStrengthCheck : public QWidget
{
    Q_OBJECT
 
public:
    PasswordStrengthCheck(QWidget *parent = nullptr);
    ~PasswordStrengthCheck();
    virtual QSize minimumSizeHint() const override;
    void onLineEditTextChanged(const QString &text);
 
protected:
    void paintEvent(QPaintEvent *event)override;
 
private:
    void onTimer();
    QRegularExpression lowRegularExpression;
    QRegularExpression mediumRegularExpression;
    QRegularExpression highRegularExpression;
    double targetRatio{0};
    double nowRatio{0};
    QTimer timer;
};
#endif // WIDGET_H
#include "widget.h"
#include <QPainter>
#include <QPaintEvent>
#include <QPainterPath>
 
PasswordStrengthCheck::PasswordStrengthCheck(QWidget *parent)
    : QWidget(parent)
{
    lowRegularExpression = QRegularExpression("[A-Z][a-z][A-Za-z0-9_]{4,6}");
    mediumRegularExpression = QRegularExpression("[A-Z][a-z][A-Za-z0-9_]{7,9}");
    highRegularExpression = QRegularExpression("[A-Z][a-z][A-Za-z0-9_]{10,12}");
 
    connect(&timer,&QTimer::timeout,this,&PasswordStrengthCheck::onTimer);
    timer.setInterval(40);
}
 
PasswordStrengthCheck::~PasswordStrengthCheck()
{
}
 
QSize PasswordStrengthCheck::minimumSizeHint() const
{
    return QSize(100,30);
}
 
void PasswordStrengthCheck::onLineEditTextChanged(const QString & text)
{
    if(highRegularExpression.match(text).hasMatch())
    {
        targetRatio = 1;
    }
    else if(mediumRegularExpression.match(text).hasMatch())
    {
        targetRatio = 0.66;
    }
    else if(lowRegularExpression.match(text).hasMatch())
    {
        targetRatio = 0.33;
    }
    else
    {
        targetRatio = 0;
    }
    timer.start();
}
 
void PasswordStrengthCheck::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);
    const auto rect = event->rect();
 
    auto width = rect.width();
    auto height = rect.height();
    painter.setBrush(Qt::white);
    painter.setPen(QPen(QBrush("#128bf1"),3));
 
    int radiu = 3;
    QRect borderRect = QRect(width*0.05,0,width*0.9,height).adjusted(radiu,radiu,-radiu,-radiu);
    painter.drawRoundedRect(borderRect,radiu,radiu);
 
    QPainterPath path;
    path.addRoundedRect(borderRect.adjusted(radiu,radiu,-radiu,-radiu),radiu,radiu);
    QPainterPath path2;
    path2.addRect(QRect(QPoint(borderRect.x() + borderRect.width() * 0.3,
                               borderRect.y()),borderRect.bottomRight()));
 
    QPainterPath path_left = path - path2;
 
    path2.clear();
    path2.addRect(QRect(borderRect.topLeft(),
                        QPoint(borderRect.x() + borderRect.width() * 0.7,borderRect.bottom())));
    QPainterPath path_right = path - path2;
 
    QRect mediumRect = QRect(QPoint(borderRect.x() + borderRect.width() * 0.35,borderRect.top()),
                             QPoint(borderRect.bottomRight() - QPoint(borderRect.width() * 0.35,0))).adjusted(0,radiu,0,-radiu);
 
    QPixmap greyPixmap(rect.size());
    {
        greyPixmap.fill(Qt::transparent);
        QPainter painter(&greyPixmap);
        QBrush brush("#CDCDCD");
        painter.setRenderHint(QPainter::Antialiasing,true);
        painter.fillPath(path_left,brush);
        painter.fillPath(path_right,brush);
        painter.fillRect(mediumRect,brush);
    }
    painter.drawPixmap(rect,greyPixmap);
 
    if(nowRatio > 0)
    {
        QPixmap colorPixmap(QSize(width * nowRatio,height));
        {
            colorPixmap.fill(Qt::transparent);
            QPainter painter(&colorPixmap);
            painter.setRenderHint(QPainter::Antialiasing,true);
            painter.fillPath(path_left,QBrush("#EC3700"));
            painter.fillPath(path_right,QBrush("#F78115"));
            painter.fillRect(mediumRect,QBrush("#6AA000"));
        }
        painter.drawPixmap(QPoint(0,0),colorPixmap);
    }
}
 
void PasswordStrengthCheck::onTimer()
{
    static double e=0.0002;
 
    if(fabs(targetRatio - nowRatio) < e)
    {
        timer.stop();
        return;
    }
 
    if(nowRatio < targetRatio)
    {
        nowRatio += 0.02;
    }
    else
    {
        nowRatio -= 0.02;
    }
    update();
}

使用:

#include "widget.h"
#include <QApplication>
#include <QLineEdit>
#include <QFormLayout>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QWidget w;
    QLineEdit * lineEdit = new QLineEdit;
    PasswordStrengthCheck * c = new PasswordStrengthCheck;
    QObject::connect(lineEdit,&QLineEdit::textChanged,c,&PasswordStrengthCheck::onLineEditTextChanged);
    QFormLayout * layout = new QFormLayout(&w);
    layout->addRow("密码:",lineEdit);
    layout->addRow("",c);
    w.show();
    return a.exec();
}

效果:

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

(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

  • jQuery密码强度验证控件使用详解

    本文实例为大家分享了jQuery密码强度验证控件,供大家参考,具体内容如下 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script type="text/javascript" src="jquery-1.12.1.js"></script>

  • Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

    Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) 先给大家展示下效果图: [功能] 下拉刷新和上拉分页逻辑 /下拉刷新 /上拉更多 /滚动栏 /工具栏半拉显隐 Author: surfsky.cnblogs.com Lisence: MIT 请保留此文档声明 History: init. surfsky.cnblogs.com, 2015-01 add initPosition pro

  • 根据Eval()函数绑定的值,来显示GridView中的控件的方法

    复制代码 代码如下: <asp:TemplateField HeaderText="操作" ShowHeader="False">                                 <ItemTemplate>                                 <asp:LinkButton ID="btn_zhiding" runat="server" Command

  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visibility="visible"; 方法二: 复制代码 代码如下: document.all["panelsms&

  • Python深度学习实战PyQt5基本控件使用解析

    目录 1. PyQt5 控件简介 1.1 什么是控件 1.2 编辑控件的属性 1.3 PyQt5 的控件类型 输入控件: 显示控件: 高级控件: 2. 按钮控件 2.1 按钮控件简介 2.2 按键按钮(QPushButton) 2.3 其它按钮 3. 输入控件 3.1 输入控件简介 3.2 文本输入控件 3.3 调节输入控件 4. Python 应用程序调用图形界面 1. PyQt5 控件简介 1.1 什么是控件 控件也称控件对象,是 Qt用户界面上最基本的组件类型,也是构成用户界面的基本结构.

  • ASP.NET中 TextBox 文本输入框控件的使用方法

    TextBox控件又称文本框控件,为用户提供输入文本的功能. 1.属性 TextBox控件的常用属性及说明如表1所示. 表1 TextBox控件常用属性及说明 属性 说明 AutoPostBack 获取或设置一个值,该值指示无论何时用户在TextBox控件中按〈Enter〉键或〈Tab〉键时,是否自动回发到服务器的操作 CausesValidation 获取或设置一个值,该值指示当TextBox控件设置为在回发发生时进行验证,是否执行验证 ID 控件ID Text 控件要显示的文本 TextMo

  • ASP.NET中的Web控件介绍

    目录 一.HTML控件 二.HTML服务器控件 三.Web服务器控件 Web服务器控件和html服务器控件的区别 四.Web用户控件 五.Web自定义控件 1.用户控件和自定义控件的异同 2.实现自定义控件 3.复合自定义控件 1.ASP.NET登录控件的开发 2.ASP.NET登录控件的使用 4.自定义分页控件 一.HTML控件 就是我们通常的说的html语言标记,这些语言标记在已往的静态页面和其他网页里存在,不能在服务器端控制的,只能在客户端通过javascript等程序语言来控制. <in

  • ASP.NET中Label控件用法详解

    Label 控件提供了一种在 ASP.NET 网页中以编程方式设置文本的方法.当希望在运行时更改网页中的文本(比如响应按钮单击)时,通常可以使用 Label 控件. 一.属性 Label控件的常用属性及说明如表1所示. 表1 Label控件常用属性及说明 属性 说明 ID 控件的ID名称 Text 控件显示的文本 Width 控件的宽度 Visible 控件是否可见 CssClass 控件呈现的样式 BackColor 控件的背景颜色 Enabled 控件是否可用 下面详细介绍Label控件的一

  • 在ASP.NET 2.0中操作数据之十九:给编辑和新增界面增加验证控件

    导言 在前面三节的示例中,GridView和DetailsView控件使用的是绑定列和CheckBoxField(绑定GridView和DetailsView时,通过智能标记可以令VS根据数据库自动增加对应的类型).当编辑GridView或者DetailsView中的一行时,非只读属性的绑定列将自动转为textbox,以便用户修改现有的数据.同样地,当在DetailsView控件中新增记录时,InsertVisible属性为true(默认值)的绑定列会呈现出空的textbox,以接受用户输入.C

随机推荐