Qt实现验证码相关功能的代码示例

 更新时间:2024年01月28日 09:31:36   作者:做一个AC梦  
验证码的原理基于人类视觉和计算机视觉的差异性,通过给用户显示一些难以被机器识别的图形或文字,让用户进行人机交互,确认自己的身份,这样可以有效保护网站安全,所以本给大家介绍了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_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    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实现验证码相关功能的代码示例的详细内容,更多关于Qt实现验证码功能的资料请关注脚本之家其它相关文章!

相关文章

  • C语言单链表实现方法详解

    C语言单链表实现方法详解

    这篇文章主要介绍了C语言单链表实现方法,结合实例形式分析了基于C语言的单链表定义、创建、添加、删除、排序、打印等操作技巧,并附带了相关的优化算法,需要的朋友可以参考下
    2018-04-04
  • C语言与C++动态通讯录超详细实现流程

    C语言与C++动态通讯录超详细实现流程

    这篇文章主要为大家介绍了C语言与C++动态实现通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-05-05
  • 解析C++中的虚拟函数及其静态类型和动态类型

    解析C++中的虚拟函数及其静态类型和动态类型

    虚拟函数(Visual Function)亦常被成为虚函数,是C++中的一个重要特性,本文我们就来解析C++中的虚拟函数及其静态类型和动态类型
    2016-06-06
  • 基于C语言实现猜数字游戏

    基于C语言实现猜数字游戏

    这篇文章主要为大家详细介绍了基于C语言实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言编程实例之输出指定图形问题

    C语言编程实例之输出指定图形问题

    这篇文章主要介绍了C语言编程实例之输出指定图形问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C语言实现影院管理系统

    C语言实现影院管理系统

    这篇文章主要为大家详细介绍了C语言实现影院管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C++17 使用 std::string_view避免字符串拷贝优化程序性能

    C++17 使用 std::string_view避免字符串拷贝优化程序性能

    这篇文章主要介绍了C++17 使用 std::string_view避免字符串拷贝优化程序性能,帮助大家提高程序运行速度,感兴趣的朋友可以了解下
    2020-10-10
  • C语言中`||`的短路机制详解

    C语言中`||`的短路机制详解

    在C语言中,逻辑或运算符(||)是一种常用的逻辑运算符,用于组合多个条件表达式,C语言中的逻辑或运算符具有短路机制,这是一种非常重要的概念,本文将深入解释C语言中的||短路机制以及其在编程中的应用,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • Qt实战案例之如何利用QProcess类实现启动进程

    Qt实战案例之如何利用QProcess类实现启动进程

    这篇文章主要介绍了Qt实战案例之如何利用QProcess类实现启动进程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 数据结构之带头结点的单链表

    数据结构之带头结点的单链表

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:数据域(数据元素的映象) + 指针域(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据
    2023-07-07

最新评论