mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-14 09:01:50 +08:00
has been completed.
This commit is contained in:
124
verifycodewidget.cpp
Normal file
124
verifycodewidget.cpp
Normal 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();
|
||||
}
|
||||
Reference in New Issue
Block a user