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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213226.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《YOLOv8原创自研》专栏介绍 CSDN独家改进创新实战专栏目录

YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm1001.2014.3001.5482 &#x1f4a1;&#x1f4a1;&#x1f4a1;全网独家首发创新&#xff08;原创&#xff09;&#xff0c;适合paper &#xff01;&#xff01;&#xff01; &#x1f4a1;&a…

分治-归并排序

文章目录 &#x1f31e;315. 计算右侧小于当前元素的个数&#x1f308;1. 题目⛅2. 算法原理&#x1fa90;3. 代码实现 &#x1f315;493. 翻转对&#x1f320;1. 题目⭐2. 算法原理&#x1f31f;3. 代码实现 &#x1f31e;315. 计算右侧小于当前元素的个数 &#x1f308;1. 题…

Matlab数学建模详解之发电机的最佳调度实现

&#x1f517; 运行环境&#xff1a;Matlab、Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&am…

String类 ---java

目录 一. 常用的字符串的构造 二. 字符串的源代码 三. 字符串比较 1. 是不能比较字符串的值的 ​编辑 2.比较两个字符串 --- compareTo() 3. 忽略大小写比较 ---compareToIgnoreCase() 四. 字符串转化 1. 数字转字符串 valueOf() 2. 字符串转数字 3. 小写转大写 to…

树莓派多串口通信

树莓派多串口通信 串口配置串口通信函数分析串口通信示例代码 参考博文1&#xff1a;树莓派 4 UART 多串口配置通信参考博文2&#xff1a;树莓派wiringPi库详解关于树莓派相关其他环境配置可参考&#xff1a;快速上手树莓派关于wiringPi库初始化与IO口开发可参考&#xff1a;树…

OpenLayer库的学习入门总结

前言&#xff1a; 作者跟随视频学习ol库的调用与功能实现&#xff0c;进行初步总结与回顾。 声明&#xff1a;参考新中地的文档&#xff0c;进行作者日后复习再次学习的简化。 1、WebGIS简介 GIS的核心概念 GIS&#xff08;Geographic Information System&#xff09;是一…

第 374 场 LeetCode 周赛题解

A 找出峰值 枚举 class Solution { public:vector<int> findPeaks(vector<int> &mountain) {int n mountain.size();vector<int> res;for (int i 1; i < n - 1; i)if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i 1…

中断方式的数据接收2

Echo实验 回忆之前的实验因为数据处理的过程可以瞬间完成所以可以把数据处理的操作放在中断服务函数中执行 但是数据处理要是时间过长就将数据缓存处理 当使用中断方式接收数据的时候 一般有两种方式 数据处理的时间较短可放在中断服务函数内处理&#xff08;就地处理&#…

【Linux--进程】

目录 一、基本概念1.1描述进程-PCB1.2task_struct中内容分类 二、了解进程2.1查看进程2.2通过系统调用获取进程标识符 三、fork创建进程3.1fork()函数3.2写时拷贝 四、进程的状态4.1操作系统学科里的进程状态&#xff08;运行、阻塞、挂起&#xff09;4.具体的Linux状态是如何维…

LinuxBasicsForHackers笔记 --常用Linux命令

在终端中修改用户密码命令&#xff1a;passwd Linux的文件系统是逻辑文件系统。 Linux基本命令 pwd – print working directory. 返回你当前所在目录结构中的位置。 whoami – 查看您当前登录的用户身份。 cd – change directory. 从终端更改目录。 cd / – 移动到根目录…

大数据实战项目_电商推荐系统

一、 项目介绍 HadoopSpark (Python)Scala SparkSQLSparkStreaming MongoDB Redis Kafka Flume ( SpringMVC vue) 1 项目介绍 1.1 项目系统架构 项目以推荐系统建设领域知名的经过修改过的中文亚马逊电商数据集作为依托&#xff0c;以某电商网站真实业务数据架构为基…

openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数

文章目录 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数139.1 操作步骤139.2 异常处理 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数 如果应用程序与数据库的连接数超过最大值&#xff0c;则新的连接无法建立。建议每天检查连…

淘宝商家店铺注册流程

如果本身已经有淘宝账号了&#xff0c;直接从第三步骤&#xff1a;创建店铺开始就可以了。一、注册淘宝账号、支付宝账号 首先,如果你有买家账号,是可以直接拿来开店的&#xff0c;不用单独在注册淘宝账号开店。 注意事项: 1:淘宝账号注册后,不能修改,如果会员名有写错情况&a…

【多线程】-- 10线程同步synchronized方法/块

多线程 6 线程同步 同步方法 由于我们可以通过private关键字来保证数据对象只能被方法访问&#xff0c;所以我们只需要针对方法提出一套机制&#xff0c;这套机制就是synchronized关键字&#xff0c;它包括以下两种用法&#xff1a; ​ synchronized方法和synchronized块 …

初始化 Clouder Manager 数据库报错Unable to find JDBC driver for database type: MySQL

CDH部署初始化 Clouder Manager 数据库报错。 解决方法&#xff1a; 把mysql驱动放到 /usr/share/java/目录下面(没有的新建&#xff09;&#xff0c;驱动名称也要修改为mysql-connector-java.jar 再次执行后成功&#xff1a; sudo /opt/cloudera/cm/schema/scm_prepare_data…

javaweb mybatis(手动jar包)

基础&#xff1a;https://blog.csdn.net/qq_67832732/article/details/134764134 条件查询 在映射文件的SQL配置中配置参数 使用parameterType来指定参数类型 使用#{参数名}来接收参数的值 parameterType"string" 表示sql语句需要一个参数&#xff0c;类型为字符…

串行口的工作原理及应用

前言 对最近串行口的学习进行一下总结。 参考链接 【51单片机】串口通信 - 知乎 (zhihu.com) LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff09;_proteus数码管显示-CSDN博客 定时器/计数器的应用-CSDN博客 74ls164_百度百科 (baidu.com) 74ls165中文资…

Kafka 的特点和优势

Apache Kafka 作为一款分布式流处理平台&#xff0c;以其独特的特点和卓越的优势成为实时数据处理领域的瑰宝。本文将深入研究 Kafka 的各项特点和优势&#xff0c;并通过详实的示例代码展示其在不同场景下的强大应用。 高吞吐量和水平扩展 Kafka 的设计注重高吞吐量和水平扩…

使用外部编辑器编辑执行MAXScript代码的方法

如何使用外部编辑器编辑执行MAXScript代码&#xff1f;这里我们要借助一个3dMax插件程序MXSCOM&#xff0c;MXSCOM允许从外部代码编辑器编辑和执行3ds Max MaxScript和Python文件。 2005年&#xff0c;Simon Feltman发布了第一个MXSCOM&#xff0c;这是一个小型的Visual Basic …

【Delphi】实现彩色日志显示框

目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候&#xff0c;经常需要显示程序运行的日志&#xff0c;一般我们会使用TMemo&#xff0c;使用起来简单&#xff0c…