当前位置: 首页 > article >正文

9、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”,输出“验证码错误”提示信息


http://www.kler.cn/a/156663.html

相关文章:

  • 重构开发之道,Blackbox.AI为技术注入智能新动力
  • 卷积神经网络之Yolo详解
  • [DEBUG] 服务器 CORS 已经允许所有源,仍然有 304 的跨域问题
  • 网络基础概念与应用:深入理解计算机网络
  • 使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)
  • SystemVerilog学习笔记(六):控制流
  • SASE,移动办公的安全防御小能手
  • ES如何提高召回率之【词干提取】
  • 『PyTorch学习笔记』分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行
  • android13(T) 客制化预置语言列表
  • XunSearch 讯搜 error: storage size of ‘methods_bufferevent’ isn’t known
  • 软考初级、中级、高级怎么选?
  • 04-数据库操作对象Statement对象和PreparedStatement对象的区别,SQL注入的优缺点
  • yolov5实现多图形识别和图像训练
  • 多线程详解1-互斥锁,读写锁,生产者消费者模型
  • docker 如何在容器内重启 php
  • 数据管理系统-week9-事务处理程序简介
  • ADAudit Plus:强大的网络安全卫士
  • RflySim | 姿态控制器设计实验一
  • 接口测试--知识问答
  • CCFCSP试题编号:202006-2试题名称:稀疏向量
  • 科普类软文怎么写才能提高用户接受度?媒介盒子分享
  • 拼多多关键词搜索商品列表接口调用演示,关键词搜索接口,item_search - 按关键字搜索商品列表案例
  • 在线陪诊系统: 医疗科技的崭新前沿
  • MacOS 14 系统 XCode15、 Flutter 开发 IOS
  • QJsonObject 是 Qt 框架中用于表示 JSON 对象的类