Qt使用隨機(jī)驗(yàn)證碼的實(shí)現(xiàn)示例
一、新建項(xiàng)目
創(chuàng)建一個(gè)"Qt Widget Application"項(xiàng)目,基類選擇“QMainWindow”
二、自定義CaptchaLabel類
右擊項(xiàng)目名,選擇"Add New...”

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

更改類名CaptchaLabel,添加基類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);
}
//繪制干擾線
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類
在項(xiàng)目的界面編輯器中添加一個(gè)QLabel,右擊,提升為

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

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

label的基類被更改為自定義CaptchaLabel類

再在界面上添加一個(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)文章
C語(yǔ)言一看就懂的選擇與循環(huán)語(yǔ)句及函數(shù)介紹
函數(shù)是一個(gè)功能模塊,它把實(shí)現(xiàn)某個(gè)功能的代碼塊包含起來(lái),并起一個(gè)函數(shù)名,供別人調(diào)用,如printf函數(shù),如system函數(shù)。是程序運(yùn)行當(dāng)中包裝起來(lái)的一個(gè)步驟;選擇與循環(huán)是編程中最常用的結(jié)構(gòu),本篇文章用最簡(jiǎn)單的文字帶你了解它們2022-04-04
OpenCV實(shí)現(xiàn)單目尺寸估計(jì)的案例詳解
這篇文章主要介紹了通過(guò)OpenCV如何實(shí)現(xiàn)單目尺寸估計(jì),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)和工作有一定的參考價(jià)值,感興趣的可以了解一下2022-01-01
深度解析三個(gè)常見(jiàn)的C語(yǔ)言內(nèi)存函數(shù)
這篇文章主要深度解析了三個(gè)常見(jiàn)的C語(yǔ)言內(nèi)存函數(shù)memcpy,memmove,memcmp,所以本文將對(duì)memcpy,memmove,memcmp 三個(gè)函數(shù)進(jìn)行詳解和模擬實(shí)現(xiàn),需要的朋友可以參考下2023-07-07
C語(yǔ)言中send()函數(shù)和sendto()函數(shù)的使用方法
這篇文章主要介紹了C語(yǔ)言中send()函數(shù)和sendto()函數(shù)的使用方法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)的方法
本篇文章是對(duì)使用C語(yǔ)言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
對(duì)比C語(yǔ)言中memccpy()函數(shù)和memcpy()函數(shù)的用法
這篇文章主要介紹了對(duì)比C語(yǔ)言中memccpy()函數(shù)和memcpy()函數(shù)的用法,二者都是用于復(fù)制內(nèi)存內(nèi)容,注意區(qū)別,需要的朋友可以參考下2015-08-08
C語(yǔ)言實(shí)現(xiàn)控制臺(tái)掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)控制臺(tái)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
C++map,set,multiset,multimap詳細(xì)解析
在C++標(biāo)準(zhǔn)模板庫(kù)(STL)中,容器分為關(guān)聯(lián)式容器和序列式容器兩大類,關(guān)聯(lián)式容器主要包括set、map、multiset和multimap,通過(guò)索引來(lái)訪問(wèn)元素,本文給大家介紹C++?map,set,multiset,multimap的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2024-09-09
C++實(shí)現(xiàn)LeetCode(75.顏色排序)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(75.顏色排序),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

