这篇文章主要为大家详细介绍了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();
}
效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:Qt编写显示密码强度的控件


猜你喜欢
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- C语言详解float类型在内存中的存储方式 2023-03-27
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- C语言qsort()函数的使用方法详解 2023-04-26
- ubuntu下C/C++获取剩余内存 2023-09-18
- C++ 数据结构超详细讲解顺序表 2023-03-25
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Easyx实现扫雷游戏 2023-02-06
- Qt计时器使用方法详解 2023-05-30