QT生成隨機(jī)驗(yàn)證碼的方法
本文實(shí)例為大家分享了QT生成隨機(jī)驗(yàn)證碼的具體代碼,供大家參考,具體內(nèi)容如下
一、先創(chuàng)建一個QT應(yīng)用程序,在ui中添加一個QFrame控件,后期將這個控件提升為下面自己實(shí)現(xiàn)驗(yàn)證碼的類就可以顯示出來了。
示例代碼如下:
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "verification.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { ? ? Q_OBJECT public: ? ? MainWindow(QWidget *parent = nullptr); ? ? ~MainWindow(); private slots: ? ? void on_pushButton_clicked(); ? ?? private: ? ? Ui::MainWindow *ui; ? ? Verification *verification; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) ? ? : QMainWindow(parent) ? ? , ui(new Ui::MainWindow) { ? ? ui->setupUi(this); ? ? verification = ui->frame; ?//提升類控件名 } MainWindow::~MainWindow() { ? ? delete ui; } void MainWindow::on_pushButton_clicked() ? ?//點(diǎn)擊跟新驗(yàn)證碼 { ? ? ?verification->Timer_Timeout(); }
主函數(shù):
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.ui
二、右擊新添加一個Qt設(shè)計(jì)師類,在里面實(shí)現(xiàn)驗(yàn)證碼的隨機(jī)生成。
代碼如下:
verification.h
#ifndef VERIFICATION_H #define VERIFICATION_H #include <QPainter> #include <QTimer> #include <QFrame> #include <QChar> #include <QColor> class Verification : public QFrame { ? ? Q_OBJECT public: ? ? Verification(QWidget *parent = Q_NULLPTR); ? ? ~Verification(); public: ? ? QString getVerificationCodes() const; ? 返回一個字符串(默認(rèn)全為小寫)(驗(yàn)證碼) ? ? QChar produceRandomLetters() const; ? ? //隨機(jī)產(chǎn)生一個字符 ? ? void produceVerificationCodes() const; ?//這是一個用來生成驗(yàn)證碼的函數(shù) ? ? void produceRandomColors() const; ? ? ? //產(chǎn)生隨機(jī)的顏色 ? ? void paintEvent(QPaintEvent *event); ? ?//重寫繪制事件,以此來生成驗(yàn)證碼 ? ? Qt::GlobalColor* getColor(); ? ? ? ? ? ?//返回設(shè)置驗(yàn)證碼的顏色 ? ? void Timer_Timeout(); ? ? QString getCaptcha(); private: ? ? const int letter_number = 4; ? ?//產(chǎn)生字符的數(shù)量 ? ? Qt::GlobalColor* m_color; ? ? QString m_captcha; ? ? QTimer m_timer; ? ? enum { ? ? ? ? ? ? ? ? ? ? ? ? ?//枚舉分類,也可自己定義 ? ? ? ? ? ?NUMBER_FLAG, ? ? ? ? ? ?UPLETTER_FLAG, ? ? ? ? ? ?LOWLETTER_FLAG ? ? ? ?}; ? ? QChar *verificationCode; ? ? QColor *colorArray; }; #endif // VERIFICATION_H
verification.cpp
#include "verification.h" #include <QTime> #include <QPaintEvent> Verification::Verification(QWidget *parent) ? ? :QFrame(parent) { ? ? //生成隨機(jī)種子 ? ? qsrand(QTime::currentTime().second() * 1000 + QTime::currentTime().msec()); // ? ?m_captcha = getVerificationCode(); // ? ?m_color = getColor(); ? ? // ? ?m_timer.start(200); ? ? colorArray = new QColor[letter_number]; ? ? verificationCode = new QChar[letter_number]; ? ? m_captcha = getVerificationCodes(); } Verification::~Verification() { } ification::getVerificationCodes() const { ? ? QString s =""; ? ? QChar cTemp; ? ? for (int i = 0; i < letter_number; ++i) ? ? { ? ? ? ? cTemp = verificationCode[i]; ? ? ? ? s += cTemp>97?cTemp.toUpper():cTemp; ? ? } ? ? return s; } QChar Verification::produceRandomLetters() const { ? ? QChar c; ? ? int flag = qrand() % letter_number; ? ? switch (flag) ? ? { ? ? case NUMBER_FLAG:c='0' + qrand() % 10; break; ? ? case UPLETTER_FLAG:c='A' + qrand() % 26; break; ? ? case LOWLETTER_FLAG:c='a' + qrand() % 26; break; ? ? default:c=qrand() % 2 ? 'W' : 'D'; ? ? } ? ? return c; } void Verification::produceVerificationCodes() const { ? ? for (int i = 0; i < letter_number; ++i) ? ? ? ? ?verificationCode[i] = produceRandomLetters(); } void Verification::produceRandomColors() const { ? ? for (int i = 0; i < letter_number; ++i) ? ? ? ? colorArray[i] = QColor(qrand() % 255, qrand() % 255, qrand() % 255); } void Verification::Timer_Timeout() { // ? ?m_captcha = getVerificationCode(); ? ? m_captcha = getVerificationCodes(); // ? ?this->repaint(); ? ? this->update(); } QString Verification::getCaptcha() { ? ? return getVerificationCodes(); } void Verification::paintEvent(QPaintEvent *event) { ? ? painter(this); ? ? QPoint p; ? ? //背景設(shè)為白色 ? ? painter.fillRect(this->rect(), Qt::white); ? ? //產(chǎn)生4個不同的字符 ? ? produceVerificationCodes(); ? ? //產(chǎn)生4個不同的顏色 ? ? produceRandomColors(); ? ? //繪制驗(yàn)證碼 ? ? for (int i = 0; i < letter_number; ++i) ? ? { ? ? ? ? p.setX(i*(this->width() / letter_number)+this->width()/14); ? ? ? ? p.setY(this->height() / 1.5); ? ? ? ? painter.setPen(colorArray[i]); ? ? ? ? painter.drawText(p, QString(verificationCode[i])); ? ? } ? ? return; }
三、在主函數(shù)里面添加如下代碼:
**.h
?Verification *verification;
**.cpp
void VLoginDlg::on_btnClick_clicked()?? ?//點(diǎn)擊更新驗(yàn)證碼 { ? ? verification->Timer_Timeout(); }
運(yùn)行效果圖
當(dāng)點(diǎn)擊最右端按鈕時,驗(yàn)證碼會自動刷新
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
floyd算法實(shí)現(xiàn)思路及實(shí)例代碼
這篇文章主要介紹了floyd算法實(shí)現(xiàn)思路及實(shí)例代碼,有需要的朋友可以參考一下2014-01-01C++?select模型簡單聊天室的實(shí)現(xiàn)示例
本文主要介紹了C++?select模型簡單聊天室的實(shí)現(xiàn)示例,使用CMake項(xiàng)目進(jìn)行開發(fā),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C++使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù)
TinyXML2是一個輕量級的、開源的C++庫,專門用于解析和生成XML文檔,本文主要為大家介紹了如何使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù),需要的可以參考下2024-04-04C++語法詳解之封裝、構(gòu)造函數(shù)、析構(gòu)函數(shù)
這篇文章主要介紹了C++語法詳解之封裝、構(gòu)造函數(shù)、析構(gòu)函數(shù)的相關(guān)知識,通過實(shí)例代碼給大家詳細(xì)介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03