Files
MyChat_Client/verifycodewidget.cpp
2025-09-09 15:37:57 +08:00

125 lines
3.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();
}