Qt使用隨機驗證碼的實現(xiàn)示例
一、新建項目
創(chuàng)建一個"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); //獲取隨機數(shù) QString getRandNumber() { return m_randNumber; } void generateRandNumber(int num = 4); //生成隨機數(shù) protected: void paintEvent(QPaintEvent *event); //繪制 void mousePressEvent(QMouseEvent *event); //鼠標按下 private: QString m_randNumber; //隨機數(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); //設置最小大小 this->setStyleSheet("background-color:white;"); //白色背景 //隨機數(shù)種子初始化 qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); //生成隨機數(shù) generateRandNumber(); } /** * @brief CaptchaLabel::generateRandNum 生成隨機數(shù),默認是四個數(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) //大寫字母 { 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(); //幾個隨機數(shù) 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); //若設置字體加粗,有的隨機數(shù)會顯示不全 QPen pen; //繪制隨機數(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); //測試時,查看矩形的位置及大小 //在矩形rect中繪制大小為size的隨機數(shù) 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 鼠標點擊時更換隨機數(shù) * @param event */ void CaptchaLabel::mousePressEvent(QMouseEvent *event) { Q_UNUSED(event); //重新生成驗證碼 generateRandNumber(); //實時更新 update(); }
三、使用自定義CaptchaLabel類
在項目的界面編輯器中添加一個QLabel,右擊,提升為
輸入類名,點擊“添加”
出現(xiàn)如下紅框中的內(nèi)容,點擊“提升”
label的基類被更改為自定義CaptchaLabel類
再在界面上添加一個QLineEdit和QPushButton控件,再進行垂直布局
右擊PushButton,選擇“轉(zhuǎn)到槽”
選擇“clicked()”,點擊“OK”
生成如下代碼
更改代碼如下
四、運行測試
運行項目
驗證碼大小隨著界面大小更改而更改
點擊label,驗證碼會改變
輸入正確的驗證碼(區(qū)分大小寫),點擊“PushButton”,輸出“驗證碼正確”提示信息
輸入錯誤的驗證碼(區(qū)分大小寫),點擊“PushButton”,輸出“驗證碼錯誤”提示信息
到此這篇關(guān)于Qt使用隨機驗證碼的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Qt 隨機驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言一看就懂的選擇與循環(huán)語句及函數(shù)介紹
函數(shù)是一個功能模塊,它把實現(xiàn)某個功能的代碼塊包含起來,并起一個函數(shù)名,供別人調(diào)用,如printf函數(shù),如system函數(shù)。是程序運行當中包裝起來的一個步驟;選擇與循環(huán)是編程中最常用的結(jié)構(gòu),本篇文章用最簡單的文字帶你了解它們2022-04-04C語言中send()函數(shù)和sendto()函數(shù)的使用方法
這篇文章主要介紹了C語言中send()函數(shù)和sendto()函數(shù)的使用方法,是C語言入門學習中的基礎知識,需要的朋友可以參考下2015-09-09使用C語言遞歸與非遞歸實現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)的方法
本篇文章是對使用C語言遞歸與非遞歸實現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)進行了詳細的分析介紹,需要的朋友參考下2013-05-05對比C語言中memccpy()函數(shù)和memcpy()函數(shù)的用法
這篇文章主要介紹了對比C語言中memccpy()函數(shù)和memcpy()函數(shù)的用法,二者都是用于復制內(nèi)存內(nèi)容,注意區(qū)別,需要的朋友可以參考下2015-08-08C++map,set,multiset,multimap詳細解析
在C++標準模板庫(STL)中,容器分為關(guān)聯(lián)式容器和序列式容器兩大類,關(guān)聯(lián)式容器主要包括set、map、multiset和multimap,通過索引來訪問元素,本文給大家介紹C++?map,set,multiset,multimap的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧2024-09-09