Qt編寫顯示密碼強度的控件
更新時間:2022年06月14日 14:08:13 作者:友善啊,朋友
這篇文章主要為大家詳細介紹了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(); }
效果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。