Qt使用随机验证码的实现示例

 更新时间:2024年01月02日 11:41:13   作者:怎么追摩羯座  
有时候在登录界面需要验证码功能,这样能够防止被恶意程序攻击,本文主要介绍了Qt使用随机验证码的实现示例,具有一定的参考价值,感兴趣的可以了解一下

一、新建项目

创建一个"Qt Widget Application"项目,基类选择“QMainWindow”

二、自定义CaptchaLabel类

右击项目名,选择"Add New...”

C++ -> C++Class,点击“Choose”

更改类名CaptchaLabel,添加基类QLabel,点击“下一步”

默认,点击完成

更改captchalabel.h代码如下

#ifndef CAPTCHALABEL_H
 
#define CAPTCHALABEL_H
 
#include <QObject>
 
#include <QLabel>
 
class CaptchaLabel : public QLabel
 
{
 
public:
 
    explicit CaptchaLabel(QWidget* parent = nullptr);
 
    //获取随机数
 
    QString getRandNumber() { return m_randNumber; }
 
    void generateRandNumber(int num = 4);  //生成随机数
 
protected:
    void paintEvent(QPaintEvent *event);  //绘制
 
    void mousePressEvent(QMouseEvent *event);  //鼠标按下
 
private:
    QString m_randNumber;  //随机数
 
};
 
#endif // CAPTCHALABEL_H

更改captchalabel.cpp代码如下

#include "captchalabel.h"
#include <QDebug>
#include <QRandomGenerator>
#include <QTimer>
#include <QPainter>
#include <QTime>
 
CaptchaLabel::CaptchaLabel(QWidget *parent) : QLabel(parent)
{
    this->setMinimumSize(100, 30);  //设置最小大小
    this->setStyleSheet("background-color:white;");  //白色背景
 
    //随机数种子初始化
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
 
    //生成随机数
    generateRandNumber();
}
 
/**
* @brief CaptchaLabel::generateRandNum 生成随机数,默认是四个数
* @param num
*/
void CaptchaLabel::generateRandNumber(int num)
{
    m_randNumber.clear();
    for(int i = 0; i < num; i++)
    {
        int num = qrand() % 3;
        if(num == 0)  //数字
        {
            m_randNumber += QString::number(qrand()%10);
        }
        else if(num == 1)  //大写字母
        {
            int temp = 'A';
            m_randNumber += static_cast<QChar>(temp + qrand()%26);
        }
        else if(num == 2)  //小写字母
        {
            int temp = 'a';
            m_randNumber += static_cast<QChar>(temp + qrand()%26);
        }
    }
}
 
/**
* @brief CaptchaLabel::paintEvent 绘制验证码
*/
void CaptchaLabel::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
 
    int num = m_randNumber.size();  //几个随机数
    int width = this->width();
    int height = this->height();
 
    //设置字体
    int size = (width/num) < height ? (width/num) : height;
    QFont font;
    font.setPixelSize(size);  //设置字体大小
    font.setItalic(true);  //设置字体倾斜
    font.setFamily(QString("楷体"));
    painter.setFont(font);  //若设置字体加粗,有的随机数会显示不全
 
    QPen pen;
    //绘制随机数
    for(int i = 0; i < num; i++)
    {
        pen = QPen(QColor(qrand()%255, qrand()%255, qrand()%255));
        painter.setPen(pen);
 
        int y = (height-5-size) <= 0 ? 0 : (qrand()%(height-5-size));
        QRectF rect(width/num*i, y, width/num, size);
        //painter.drawRect(rect);  //测试时,查看矩形的位置及大小
        //在矩形rect中绘制大小为size的随机数
        painter.drawText(rect, Qt::AlignHCenter|Qt::AlignBottom, m_randNumber.at(i));
    }
 
    //绘制干扰点
    for(int i = 0; i < (num*25); i++)
    {
        pen = QPen(QColor(qrand()%256, qrand()%256, qrand()%256));
        painter.setPen(pen);
        painter.drawPoint(qrand()%width, qrand()%height);
    }
 
    //绘制干扰线
    for(int i = 0; i < num; i++)
    {
        pen = QPen(QColor(qrand()%256, qrand()%256, qrand()%256));
        painter.setPen(pen);
        painter.drawLine(qrand()%width, qrand()%height, qrand()%width, qrand()%height);
    }
}
 
/**
 
* @brief CaptchaLabel::mousePressEvent 鼠标点击时更换随机数
 
* @param event
 
*/
void CaptchaLabel::mousePressEvent(QMouseEvent *event)
 
{
 
    Q_UNUSED(event);
 
    //重新生成验证码
 
    generateRandNumber();
 
    //实时更新
 
    update();
}

三、使用自定义CaptchaLabel类

在项目的界面编辑器中添加一个QLabel,右击,提升为

输入类名,点击“添加”

出现如下红框中的内容,点击“提升”

label的基类被更改为自定义CaptchaLabel类

再在界面上添加一个QLineEdit和QPushButton控件,再进行垂直布局

右击PushButton,选择“转到槽”

选择“clicked()”,点击“OK”

生成如下代码

更改代码如下

四、运行测试

运行项目

验证码大小随着界面大小更改而更改

点击label,验证码会改变

输入正确的验证码(区分大小写),点击“PushButton”,输出“验证码正确”提示信息

输入错误的验证码(区分大小写),点击“PushButton”,输出“验证码错误”提示信息

到此这篇关于Qt使用随机验证码的实现示例的文章就介绍到这了,更多相关Qt 随机验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C++ 遍历二叉树实例详解

    C++ 遍历二叉树实例详解

    这篇文章主要介绍了C++ 遍历二叉树实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++实现折半插入排序(BinaryInsertSort)

    C++实现折半插入排序(BinaryInsertSort)

    这篇文章主要为大家详细介绍了C++实现折半插入排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言实现静态存储通讯录的示例代码

    C语言实现静态存储通讯录的示例代码

    这篇文章主要为大家详细介绍了如何利用C语言实现一个静态存储的通讯录,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-09-09
  • 简单比较C语言中的execl()函数与execlp()函数

    简单比较C语言中的execl()函数与execlp()函数

    这篇文章主要介绍了C语言中的execl()函数与execlp()函数的简单比较,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C语言实现简单弹跳小球

    C语言实现简单弹跳小球

    这篇文章主要为大家详细介绍了C语言实现简单弹跳小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言PlaySound函数使用方法

    C语言PlaySound函数使用方法

    这篇文章介绍了C语言PlaySound函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • c/c++基础简单易懂的快速排序算法

    c/c++基础简单易懂的快速排序算法

    这篇文章主要为大家介绍了c/c++基础非常简单易懂的快速排序算法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • mfc文件操作CFile类之创建文件的方法

    mfc文件操作CFile类之创建文件的方法

    这篇文章主要介绍了mfc文件操作CFile类之创建文件的方法,需要的朋友可以参考下
    2019-04-04
  • c语言数据结构之并查集 总结

    c语言数据结构之并查集 总结

    一种用于管理分组的数据结构。它具备两个操作:(1)查询元素a和元素b是否为同一组 (2) 将元素a和b合并为同一组,需要的朋友可以参考下
    2018-08-08
  • C语言求解定积分的方法

    C语言求解定积分的方法

    这篇文章主要为大家详细介绍了C语言求解定积分的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论