【Qt 即时通讯项目】登录验证码是如何做到的呢

发布于:2024-09-18 ⋅ 阅读:(140) ⋅ 点赞:(0)

1. 登录注册功能验证码实现

  • 🐧①目的:引入验证码,目的是用来避免程序被其它程序暴力破解的方式找到密码。

2. 验证码生成的流程

  • ①🍎首先通过QtQRandomGeneratorgenerate方法生成一个四个字符的随机字符串。
    在这里插入图片描述
    在这里插入图片描述

  • ②🍎 把这个字符串,通过画图 API (QPainter)绘制到界面的某个控件,通过随机数的方式,随机画这个字符的位置;

paintEvent函数是 Qt 绘图系统的核心部分,负责在部件的显示区域绘制内容。它会在多种情况下被触发,包括部件首次显示、大小变化、用户交互等。

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++)
    {
        pen = QPen(QColor(randomGenerator.generate() % 255, randomGenerator.generate() % 255, randomGenerator.generate() % 255));
        painter.setPen(pen);
        painter.drawText(5+20*i, randomGenerator.generate() % 10, 30, 30, Qt::AlignCenter, QString(verifyCode[i]));
    }
}
  • ③最后再这个控件上,随机的绘制一些线(噪点/噪线),避免其他的自动识别程序能轻易的分析出验证码;

3. 细节部分

Qt里面有一个随机生成字符的类,有些字母很相近,所以我们暂时只生成大写字母,以便于区分;

①画点:添加随机噪点(随机颜色、随机位置)

②画线:添加随机干扰线;

drawLine,随机颜色、随机起点和终点;

③绘制验证码: 随机颜色、随机位置(水平位置不是随机的,水平向右移动,垂直方向是随机的);

④验证码的比较— 要忽略大小写
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到