has been completed.

This commit is contained in:
xyz
2025-09-09 15:37:57 +08:00
parent 83f3f4f74e
commit 89ff4fbac0
38 changed files with 2679 additions and 161 deletions

124
verifycodewidget.cpp Normal file
View File

@ -0,0 +1,124 @@
#include "verifycodewidget.h"
#include <QPainter>
#include <QPen>
#include <QFont>
#include <QChar>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QColor>
#include <QString>
#include "model/data.h"
VerifyCodeWidget::VerifyCodeWidget(QWidget *parent)
: QWidget(parent),
randomGenerator(model::getTime())
{
verifyCode = generateVerifyCode();
}
QString VerifyCodeWidget::generateVerifyCode()
{
QString code;
for (int i = 0; i < 4; i++) {
//每次循环生成一个字符
int init = 'A';
init += randomGenerator.generate() % 26;
code += static_cast<QChar>(init);
}
return code;
}
void VerifyCodeWidget::refreshVerifyCode()
{
verifyCode = generateVerifyCode();
// 通过 update 就可以起到 "刷新界面" , 本身就是触发 paintEvent
this->update();
}
bool VerifyCodeWidget::checkVerifyCode(const QString& verifyCode)
{
//此处比较验证码需要忽略大小写
return this->verifyCode.compare(verifyCode, Qt::CaseInsensitive) == 0;
}
void VerifyCodeWidget::paintEvent(QPaintEvent* event)
{
(void)event;
const int width = 180;
const int height = 80;
QPainter painter(this);
QPen pen;
QFont font("楷体", 25, QFont::Bold, true);
painter.setFont(font);
// 画点: 添加随机噪点
for (int i = 0; i < 100; i++)
{
pen = QPen(QColor(randomGenerator.generate() % 256, randomGenerator.generate() % 256, randomGenerator.generate() % 256));
painter.setPen(pen);
painter.drawPoint(randomGenerator.generate() % width, randomGenerator.generate() % height);
}
// 画线: 添加随机干扰线
for (int i = 0; i < 5; i++)
{
pen = QPen(QColor(randomGenerator.generate() % 256, randomGenerator.generate() % 256, randomGenerator.generate() % 256));
painter.setPen(pen);
painter.drawLine(randomGenerator.generate() % width, randomGenerator.generate() % height,
randomGenerator.generate() % width, randomGenerator.generate() % height);
}
// 绘制验证码
for (int i = 0; i < verifyCode.size(); i++)
{
// 随机字体大小
int fontSize = 13 + randomGenerator.generate() % 16; // 20~35
QFont font("楷体", fontSize, QFont::Bold, true);
painter.setFont(font);
// 随机旋转角度(-30~30度
int angle = (randomGenerator.generate() % 61) - 30;
// 随机颜色
pen = QPen(QColor(randomGenerator.generate() % 255, randomGenerator.generate() % 255, randomGenerator.generate() % 255));
painter.setPen(pen);
// 保存当前状态
painter.save();
// 计算字符中心点
int x = 5 + 22 * i;
int y = 10;
int w = 30, h = 30;
QPoint center(x + w / 2, y + h / 2);
// 平移到中心,旋转,再平移回去
painter.translate(center);
painter.rotate(angle);
painter.translate(-center);
// 绘制字符
painter.drawText(x, y, w, h, Qt::AlignCenter, QString(verifyCode[i]));
// 恢复状态
painter.restore();
}
// 绘制验证码
/*for (int i = 0; i < verifyCode.size(); i++)
{
pen = QPen(QColor(randomGenerator.generate() % 255, randomGenerator.generate() % 255, randomGenerator.generate() % 255));
painter.setPen(pen);
painter.drawText(5 + 22 * i, randomGenerator.generate() % 10, 30, 30, Qt::AlignCenter, QString(verifyCode[i]));
}*/
}
void VerifyCodeWidget::mousePressEvent(QMouseEvent* event)
{
(void)event;
this->refreshVerifyCode();
}