#include "verifycodewidget.h" #include #include #include #include #include #include #include #include #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(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(); }