mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-13 16:41:48 +08:00
125 lines
3.5 KiB
C++
125 lines
3.5 KiB
C++
#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();
|
||
}
|