Qt实现验证码相关功能

验证码的原理

验证码的原理基于人类视觉和计算机视觉的差异性。通过给用户显示一些难以被机器识别的图形或文字,让用户进行人机交互,确认自己的身份。这样可以防止机器大规模注册、机器暴力破解数据密码等危害,保护网站安全。

Qt实现验证码的原理

  • 随机性:验证码必须是随机生成的,以确保每次显示的内容都不同。
  • 安全性:验证码的生成过程需要考虑到安全性,例如使用不同的算法生成验证码,避免被恶意程序破解。
  • 用户交互:验证码生成后,需要由用户进行识别和填写,通过用户的操作来判断用户的有效性。
  • 图形界面:在Qt中,可以使用图形界面组件来显示验证码,例如QLabel或QPushButton等。
  • 图像处理:为了增加验证码的识别难度,可以在验证码中添加噪声、扭曲等效果,这需要使用图像处理技术来实现。

实现步骤

  • 创建UI界面:首先,在QT Designer中创建一个UI界面,添加一个Label标签,两个Button按钮以及一个lineEdit输入框,并且将这些组件均放入widget样式表当中,并将widget样式表放入centralwidget样式表中。(在UI设计师界面可以使用SHIFT+ALT+R进行预览布局效果)

  • 设置Label标签:将Label标签设置为显示验证码。你可以使用QLabel类来创建标签,并设置其文本属性。

  • 实现验证码逻辑:编写代码以生成验证码。这通常涉及到一个随机数生成器,用于生成一个唯一的验证码字符串。

  • 刷新验证码:当用户点击按钮时,重新生成一个新的验证码,并更新Label标签的文本属性。

  • 验证验证码:当用户提交表单时,验证你所输入的验证码是否与Label标签上显示的验证码匹配。

具体代码

  • mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTimer>
#include <QMessageBox>
#include <QPainter>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);QString m_captcha;QColor m_color;void paintEvent(QPaintEvent* evt);QString getCaptcha();QColor generateRandomColor() ;~MainWindow();
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
  • main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
  • mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QRandomGenerator>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 设置UI界面m_captcha = getCaptcha();// 获取验证码m_color = generateRandomColor();// 生成随机颜色
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()//验证按钮的槽函数
{QString captcha = ui->lineEdit->text().replace(" ", "");// 获取用户输入的验证码并去除空格if(captcha.toLower() == m_captcha.toLower())// 将用户输入的验证码和生成的验证码进行比较(忽略大小写){QMessageBox::warning(this, "Warning", "Captcha is macthed");// 如果验证码匹配,显示匹配提示框}else{QMessageBox::warning(this, "Warning", "Captcha is not macthed");// 如果验证码不匹配,显示不匹配提示框m_captcha = getCaptcha();// 获取新的验证码}
}void MainWindow::on_pushButton_2_clicked()//刷新按钮的槽函数
{m_captcha = getCaptcha(); // 获取新的验证码m_color = generateRandomColor(); // 生成随机颜色repaint(); // 重新绘制窗口update(); // 更新窗口显示
}void MainWindow::paintEvent(QPaintEvent *evt)
{QPainter painter(this);// 填充背景为白色painter.fillRect(ui->label->x()+ui->widget->x(), ui->label->y()+ui->widget->y(), ui->label->width(), ui->label->height(), Qt::white);// 设置字体样式painter.setFont(QFont("Lucida Console", 18,QFont::Bold));// 绘制验证码字符for(int i = 0; i < 4; i++){QColor color = generateRandomColor();// 生成随机颜色QPen pen(color);pen.setWidth(1);painter.setPen(pen);painter.drawText(ui->label->x() +ui->widget->x()+ 30*i, ui->label->y()+ui->widget->y(), 30, ui->label->height(), Qt::AlignCenter,QString(m_captcha[i]));// 绘制验证码字符}// 绘制噪点for(int i=0; i<1500; i++){QColor color = generateRandomColor();// 生成随机颜色QPen pen(color);pen.setWidth(1);painter.setPen(pen);painter.drawPoint(ui->label->x()+ui->widget->x()+ (qrand() % ui->label->width()), ui->label->y()+ui->widget->y() + (qrand() % ui->label->height()));}// 绘制干扰线for(int i = 0;i < 10;++i){painter.drawLine(ui->label->x()+ui->widget->x()+qrand()%ui->label->width(),ui->label->y()+ui->widget->y()+qrand()%ui->label->height(),ui->label->x()+ui->widget->x()+qrand()%ui->label->width(),ui->label->y()+ui->widget->y()+qrand()%ui->label->height());}
}QString MainWindow::getCaptcha()
{const QString possibleCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const int captchaLength = 4;QString result = "";// 生成验证码字符串for (int i = 0; i < captchaLength; ++i) {int index = QRandomGenerator::global()->bounded(possibleCharacters.length());// 生成一个0到possibleCharacters长度之间的随机整数result.append(possibleCharacters.at(index));// 将随机位置的字符添加到结果字符串中}return result; // 返回生成的验证码字符串
}QColor MainWindow::generateRandomColor() {int red = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为红色通道的值int green = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为绿色通道的值int blue = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为蓝色通道的值return QColor(red, green, blue);// 使用生成的RGB值创建并返回一个QColor对象
}

相关代码的注解

fillRect的相关用法

  • 在Qt的QPainter类中,fillRect()函数用于填充矩形。它需要两个参数:一个QRect对象和QBrush对象。
  • QRect对象定义了矩形的位置和大小,而QBrush对象则定义了矩形的填充方式。我们可以将QColor对象作为刷子传递给这个函数,以指定实填充模式。

  • 如果颜色不是完全的不透明(即alpha通道值小于255),则先绘制白色背景,然后使用fillRect()函数填充矩形。因此,fillRect()函数的参数含义为:第一个参数是一个QRect对象,表示要填充的矩形区域。它包含了矩形的左上角坐标(x, y)和其宽度和高度(width, height)。第二个参数是一个QBrush对象,表示填充矩形的样式。可以将QColor对象作为刷子传递给这个函数,以指定实填充模式。

示例代码

void MyWidget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QRect rect(10, 10, 100, 50); // 定义一个矩形区域QColor color(255, 0, 0); // 定义红色painter.fillRect(rect, color); // 填充矩形
}
在上述示例中,我们定义了一个矩形区域 rect,左上角坐标为 (10, 10),宽度为 100,高度为 50。然后,我们使用 fillRect 方法填充该矩形区域为红色。


 对于上述代码mainwindow.cpp中的painter.fillRect(ui->label->x()+ui->widget->x(), ui->label->y()+ui->widget->y(), ui->label->width(), ui->label->height(), Qt::white);解释

如图所示
相当于求A点相当于C点的坐标,也就是将B点相对于C点的坐标+A点相对于B点的坐标
即A点相当于C点的坐标为(ui->label->x()+ui->widget->x(), ui->label->y()+ui->widget->y())

效果图

  • 初始界面

  • 验证成功

  • 验证失败

  • 刷新验证码

源代码

Qt实现验证码相关功能资源-CSDN文库

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

循环的乐章与爱情的旋律

循环的乐章与爱情的旋律 The Rhapsody of Loops and the Melody of Love 在一个阳光明媚的Java编程课上&#xff0c;男主角林浩然&#xff0c;一个热衷于代码逻辑和算法谜题的大二学生&#xff0c;正沉浸在他的Java世界里。而女主角杨凌芸&#xff0c;则是班级中出了名的“程序…

【图论】拓扑排序

昨天复习的知识点。 ​先复习一下 AOE网。 AOE网&#xff0c;简单来说就是工程的带权有向图&#xff0c;其中&#xff1a; 顶点&#xff1a;活动开始或者结束的事件边&#xff1a;活动边的权值&#xff1a;完成该活动所需的时间 在AOE网中&#xff0c;想要完成一项活动&…

认识思维之熵

经常有读者问我&#xff0c;说&#xff1a; 为什么向您请教一个问题&#xff0c;您总能很快指出在哪篇文章里面提到过&#xff0c;是因为您的记忆力特别好吗&#xff1f; 其实不是的。更重要的原因是&#xff1a;如果你经过系统训练&#xff0c;有意识地去获取知识的话&#x…

华为服务器RAID5

0、BIOS默认密码 TaiShan 100服务器BIOS系统的默认密码为 Huawei12#$ TaiShan 200服务器BIOS系统的默认密码为 Admin9000 1、服务器开机选择DEL,进行设置 2、选择设备管理器进入配置页面 3、选择AVAGO MegaRAID configuration utility 进入raid配置 4、选择 Main Menu 进入主…

在线curl命令转换工具 - KGtools

KGtools提供在线curl命令转换工具&#xff0c;帮助您将curl命令转换为Python代码或命令行格式&#xff0c;将复杂的curl命令转换为可直接在Python程序中使用的代码 https://www.kgtools.cn/convert/curl

使用Transformer 模型进行时间序列预测的Pytorch代码示例

时间序列预测是一个经久不衰的主题&#xff0c;受自然语言处理领域的成功启发&#xff0c;transformer模型也在时间序列预测有了很大的发展。本文可以作为学习使用Transformer 模型的时间序列预测的一个起点。 数据集 这里我们直接使用kaggle中的 Store Sales — Time Series …

Vue3的computed和watch

目录 1、computed 2、computed完整写法 3、watch 4、watch监听对象具体属性 5、watch 监听reactive数据 1、computed 基于现有的数据计算出新的数据 <script setup >import {ref,computed} from vue const numref(1) const doubleNumcomputed(()>{return num.val…

latex表格示例(背景颜色、行距、线粗细、标题、表格长度)

导入库 \usepackage{colortbl} 代码 \begin{table}[H] \begin{center}%表格居中 \tabcolsep1.5cm%表格横向长度 \renewcommand\arraystretch{1.5}%设置表格行间距 \begin{tabular}{cc} \toprule[2pt]%设置线的宽度 %\specialrule{0em}{3pt}{8pt}%添加一条线&#xff0c;第一个…

《Linux高性能服务器编程》笔记08

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第08章 高性能服务器程序框架8.1 服务器…

docker拉取镜像时指定其OS及CPU指令集类型

前言 之前在香橙派5上安装的时候碰到过一次指定镜像的OS及cpu指令集类型的问题&#xff0c;但是当时没有记录&#xff0c;现在用到 了又想不起来&#xff0c;干脆就自己记录一下。预防后面忘掉。docker报错截图 上次时在arm的cpu中运行x86镜像&#xff0c;这次时在x86中运行arm…

C语言从入门到入坟

前言 1.初识程序 有穷性 在有限的操作步骤内完成。有穷性是算法的重要特性&#xff0c;任何一个问题的解决不论其采取什么样的算法&#xff0c;其终归是要把问题解决好。如果一种算法的执行时间是无限的&#xff0c;或在期望的时间内没有完成&#xff0c;那么这种算法就是无用…

MYSQL库和表的操作(修改字符集和校验规则,备份和恢复数据库及库和表的增删改查)

文章目录 一、MSYQL库的操作1.连接MYSQL2.查看当前数据库3.创建数据库4.字符集和校验规则5.修改数据库6.删除数据库7.备份和恢复8.查看连接 二、表的操作1.创建表2.查看表结构3.修改表4.删除表 一、MSYQL库的操作 1.连接MYSQL 我们使用下面的语句来连接MSYQL&#xff1a; my…

关于session每次请求都会改变的问题

这几天在部署一个前后端分离的项目&#xff0c;使用docker进行部署&#xff0c;在本地测试没有一点问题没有&#xff0c;前脚刚把后端部署到服务器&#xff0c;后脚测试就出现了问题&#xff01;查看控制台报错提示跨域错误&#xff1f;但是对于静态资源请求&#xff0c;包括登…

【CSS】字体效果展示

测试时使用了Google浏览器。 1.Courier New 2.monospace 3.Franklin Gothic Medium 4.Arial Narrow 5.Arial 6.sans-serif 7.Gill Sans MT 8.Calibri 9.Trebuchet MS 10.Lucida Sans 11.Lucida Grande 12.Lucida Sans Unicode 13.Geneva 14.Verdana 15.Segoe UI 16.Tahoma 17.…

【2024华数杯国际数学建模竞赛】问题B 光伏发电 完整代码+结果分析+论文框架(二)

问题B&#xff08;二&#xff09; 5.2 问题二模型的建立与求解&#xff08;二&#xff09;5.1.4基于LSTM的时间序列预测模型5.1.5 LSTM的时间序列预测结果5.1.6 多元回归模型的预测结果5.1.7 LSTM时间序列模型的性能评价 5.2 问题二模型的建立与求解5.2.1基于皮尔逊系数相关性分…

【C++中STL】set/multiset容器

set/multiset容器 Set基本概念set构造和赋值set的大小和交换set的插入和删除set查找和统计 set和multiset的区别pair对组两种创建方式 set容器排序 Set基本概念 所有元素都会在插入时自动被排序。 set/multist容器属于关联式容器&#xff0c;底层结构属于二叉树。 set不允许容…

架构师的36项修炼-08系统的安全架构设计

本课时讲解系统的安全架构。 本节课主要讲 Web 的攻击与防护、信息的加解密与反垃圾。其中 Web 攻击方式包括 XSS 跨站点脚本攻击、SQL 注入攻击和 CSRF 跨站点请求伪造攻击&#xff1b;防护手段主要有消毒过滤、SQL 参数绑定、验证码和防火墙&#xff1b;加密手段&#xff0c…

java关键字概述——final及常量概述

前言&#xff1a; 打好基础&#xff0c;daydayup! final final概述 final关键字是最终的意思&#xff0c;可以修饰&#xff08;类&#xff0c;方法&#xff0c;变量&#xff09; final作用 修饰类&#xff1a;该类被称为最终类&#xff0c;特点为不能被继承 修饰方法&#xff…

智能GPT图书管理系统(SpringBoot2+Vue2)、接入GPT接口,支持AI智能图书馆

☀️技术栈介绍 ☃️前端主要技术栈 技术作用版本Vue提供前端交互2.6.14Vue-Router路由式编程导航3.5.1Element-UI模块组件库&#xff0c;绘制界面2.4.5Axios发送ajax请求给后端请求数据1.2.1core-js兼容性更强&#xff0c;浏览器适配3.8.3swiper轮播图插件&#xff08;快速实…

【笔试常见编程题01】删除公共字符串、组队竞赛、倒置字符串、排序子序列

1. 删除公共字符串 输入两个字符串&#xff0c;从第一字符串中删除第二个字符串中所有的字符。 例如&#xff0c;输入”They are students.”和”aeiou”&#xff0c;则删除之后的第一个字符串变成”Thy r stdnts.” 输入描述 每个测试输入包含2个字符串 输出描述 输出删除后的…