Qt实现动态检测输入密码强度及大写锁定状态。
实际效果如下:
检测密码强度主要实现:
int Widget::getPasswordStrength(const QString &pass)
{
if (pass.size() < 6)
return 0;
double fscore = 0;
QHash<QChar, int> charCounts;
for (QChar c : pass) {
charCounts[c]++;
fscore += 5. / charCounts[c];
}
// 密码位数多跟有数字、小写字母、大写字母混合组合成的密码强度高
int variations = -1;
variations += pass.contains(QRegExp("[0-9]", Qt::CaseSensitive, QRegExp::RegExp)) ? 1 : 0;
variations += pass.contains(QRegExp("[a-z]", Qt::CaseSensitive, QRegExp::RegExp)) ? 1 : 0;
variations += pass.contains(QRegExp("[A-Z]", Qt::CaseSensitive, QRegExp::RegExp)) ? 1 : 0;
variations += pass.contains(QRegExp("[\\W]", Qt::CaseSensitive, QRegExp::RegExp)) ? 1 : 0;
int score = fscore;
score += variations * 10;
score -= 20;
score = std::min(score, 100);
score = std::max(score, 0);
return score;
}
检测系统大写锁定是否开启:
// 大写锁定是否开启
bool capsLockEnabled()
{
return GetKeyState(VK_CAPITAL) == 1;
}
主要代码实现如下:
widget.h
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->newPass, &QLineEdit::textChanged, this, &Widget::slotPasswordEdited);
connect(ui->newPassConfirm, &QLineEdit::textChanged, this, &Widget::slotPasswordEdited);
}
Widget::~Widget()
{
delete ui;
}
void Widget::slotPasswordEdited()
{
ui->passStrengthMeter->setValue(getPasswordStrength(ui->newPass->text()));
}
int Widget::getPasswordStrength(const QString &pass)
{
if (pass.size() < 6)
return 0;
double fscore = 0;
QHash<QChar, int> charCounts;
for (QChar c : pass) {
charCounts[c]++;
fscore += 5. / charCounts[c];
}
// 密码位数多跟有数字、小写字母、大写字母混合组合成的密码强度高
int variations = -1;
variations += pass.contains(QRegExp("[0-9]", Qt::CaseSensitive, QRegExp::RegExp)) ? 1 : 0;
variations += pass.contains(QRegExp("[a-z]", Qt::CaseSensitive, QRegExp::RegExp)) ? 1 : 0;
variations += pass.contains(QRegExp("[A-Z]", Qt::CaseSensitive, QRegExp::RegExp)) ? 1 : 0;
variatio