亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt使用隨機(jī)驗(yàn)證碼的實(shí)現(xiàn)示例

 更新時(shí)間:2024年01月02日 11:41:13   作者:怎么追摩羯座  
有時(shí)候在登錄界面需要驗(yàn)證碼功能,這樣能夠防止被惡意程序攻擊,本文主要介紹了Qt使用隨機(jī)驗(yàn)證碼的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下

一、新建項(xiàng)目

創(chuàng)建一個(gè)"Qt Widget Application"項(xiàng)目,基類(lèi)選擇“QMainWindow”

二、自定義CaptchaLabel類(lèi)

右擊項(xiàng)目名,選擇"Add New...”

C++ -> C++Class,點(diǎn)擊“Choose”

更改類(lèi)名CaptchaLabel,添加基類(lèi)QLabel,點(diǎn)擊“下一步”

默認(rèn),點(diǎn)擊完成

更改captchalabel.h代碼如下

#ifndef CAPTCHALABEL_H
 
#define CAPTCHALABEL_H
 
#include <QObject>
 
#include <QLabel>
 
class CaptchaLabel : public QLabel
 
{
 
public:
 
    explicit CaptchaLabel(QWidget* parent = nullptr);
 
    //獲取隨機(jī)數(shù)
 
    QString getRandNumber() { return m_randNumber; }
 
    void generateRandNumber(int num = 4);  //生成隨機(jī)數(shù)
 
protected:
    void paintEvent(QPaintEvent *event);  //繪制
 
    void mousePressEvent(QMouseEvent *event);  //鼠標(biāo)按下
 
private:
    QString m_randNumber;  //隨機(jī)數(shù)
 
};
 
#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);  //設(shè)置最小大小
    this->setStyleSheet("background-color:white;");  //白色背景
 
    //隨機(jī)數(shù)種子初始化
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
 
    //生成隨機(jī)數(shù)
    generateRandNumber();
}
 
/**
* @brief CaptchaLabel::generateRandNum 生成隨機(jī)數(shù),默認(rèn)是四個(gè)數(shù)
* @param num
*/
void CaptchaLabel::generateRandNumber(int num)
{
    m_randNumber.clear();
    for(int i = 0; i < num; i++)
    {
        int num = qrand() % 3;
        if(num == 0)  //數(shù)字
        {
            m_randNumber += QString::number(qrand()%10);
        }
        else if(num == 1)  //大寫(xiě)字母
        {
            int temp = 'A';
            m_randNumber += static_cast<QChar>(temp + qrand()%26);
        }
        else if(num == 2)  //小寫(xiě)字母
        {
            int temp = 'a';
            m_randNumber += static_cast<QChar>(temp + qrand()%26);
        }
    }
}
 
/**
* @brief CaptchaLabel::paintEvent 繪制驗(yàn)證碼
*/
void CaptchaLabel::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
 
    int num = m_randNumber.size();  //幾個(gè)隨機(jī)數(shù)
    int width = this->width();
    int height = this->height();
 
    //設(shè)置字體
    int size = (width/num) < height ? (width/num) : height;
    QFont font;
    font.setPixelSize(size);  //設(shè)置字體大小
    font.setItalic(true);  //設(shè)置字體傾斜
    font.setFamily(QString("楷體"));
    painter.setFont(font);  //若設(shè)置字體加粗,有的隨機(jī)數(shù)會(huì)顯示不全
 
    QPen pen;
    //繪制隨機(jī)數(shù)
    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);  //測(cè)試時(shí),查看矩形的位置及大小
        //在矩形rect中繪制大小為size的隨機(jī)數(shù)
        painter.drawText(rect, Qt::AlignHCenter|Qt::AlignBottom, m_randNumber.at(i));
    }
 
    //繪制干擾點(diǎn)
    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);
    }
 
    //繪制干擾線(xiàn)
    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 鼠標(biāo)點(diǎn)擊時(shí)更換隨機(jī)數(shù)
 
* @param event
 
*/
void CaptchaLabel::mousePressEvent(QMouseEvent *event)
 
{
 
    Q_UNUSED(event);
 
    //重新生成驗(yàn)證碼
 
    generateRandNumber();
 
    //實(shí)時(shí)更新
 
    update();
}

三、使用自定義CaptchaLabel類(lèi)

在項(xiàng)目的界面編輯器中添加一個(gè)QLabel,右擊,提升為

輸入類(lèi)名,點(diǎn)擊“添加”

出現(xiàn)如下紅框中的內(nèi)容,點(diǎn)擊“提升”

label的基類(lèi)被更改為自定義CaptchaLabel類(lèi)

再在界面上添加一個(gè)QLineEdit和QPushButton控件,再進(jìn)行垂直布局

右擊PushButton,選擇“轉(zhuǎn)到槽”

選擇“clicked()”,點(diǎn)擊“OK”

生成如下代碼

更改代碼如下

四、運(yùn)行測(cè)試

運(yùn)行項(xiàng)目

驗(yàn)證碼大小隨著界面大小更改而更改

點(diǎn)擊label,驗(yàn)證碼會(huì)改變

輸入正確的驗(yàn)證碼(區(qū)分大小寫(xiě)),點(diǎn)擊“PushButton”,輸出“驗(yàn)證碼正確”提示信息

輸入錯(cuò)誤的驗(yàn)證碼(區(qū)分大小寫(xiě)),點(diǎn)擊“PushButton”,輸出“驗(yàn)證碼錯(cuò)誤”提示信息

到此這篇關(guān)于Qt使用隨機(jī)驗(yàn)證碼的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Qt 隨機(jī)驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評(píng)論