有時候在登入界面需要驗證碼功能,這樣能夠防止被惡意程式攻擊,驗證碼必須動态随機産生,并且有一定的識别難度。
解決方案:
1.随機産生驗證碼
2.在驗證碼區域繪制噪聲
3.驗證碼顔色随機變化
4.繼承已有QLabel控件進行重繪
随機産生驗證碼:
for (int i = ; i < letter_number; ++i) //letter_number為驗證碼位數
verificationCode[i] = produceRandomLetter(); //函數裡面随機産生一個數字 大小寫字母
随機生成顔色:
for (int i = ; i < letter_number; ++i)
verificationCode[i] = produceRandomLetter();
繪制噪聲:
for (int j = ; j < noice_point_number; ++j) //noice_point_number噪聲點數
{
p.setX(qrand() % this->width());
p.setY(qrand() % this->height());
painter.setPen(colorArray[j % ]);
painter.drawPoint(p);
}
代碼:
verificationcodelabel.h
#ifndef VERIFICATIONCODELABEL_H
#define VERIFICATIONCODELABEL_H
#include <QLabel>
class VerificationCodeLabel : public QLabel
{
Q_OBJECT
public:
VerificationCodeLabel(QWidget *parent=);
~VerificationCodeLabel();
//傳回一個字元串(字母一律都按照大寫傳回)
QString getVerificationCode() const;
public slots:
//公共槽函數
//重新整理驗證碼,在使用者不确定的時候進行相應重新整理
void slt_reflushVerification();
protected:
//重寫繪制事件,以此來生成驗證碼
void paintEvent(QPaintEvent *event);
private:
const int letter_number = ;//産生字元的數量
int noice_point_number ;//噪點的數量
enum { //枚舉分類,也可自己定義
NUMBER_FLAG,
UPLETTER_FLAG,
LOWLETTER_FLAG
};
//這是一個用來生成驗證碼的函數
void produceVerificationCode() const;
//産生一個随機的字元
QChar produceRandomLetter() const;
//産生随機的顔色
void produceRandomColor() const;
QChar *verificationCode;
QColor *colorArray;
};
#endif // VERIFICATIONCODELABEL_H
verificationcodelabel.cpp
#include "verificationcodelabel.h"
#include <QPaintEvent>
#include <QPainter>
#include <QTime>
VerificationCodeLabel::VerificationCodeLabel(QWidget *parent)
: QLabel(parent)
{
//生成随機種子
qsrand(QTime::currentTime().second() * + QTime::currentTime().msec());
colorArray = new QColor[letter_number];
verificationCode = new QChar[letter_number];
noice_point_number = this->width();
}
//重寫繪制事件,以此來生成驗證碼
void VerificationCodeLabel::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPoint p;
//背景設為白色
painter.fillRect(this->rect(), Qt::white);
//産生4個不同的字元
produceVerificationCode();
//産生4個不同的顔色
produceRandomColor();
//繪制驗證碼
for (int i = ; i < letter_number; ++i)
{
p.setX(i*(this->width() / letter_number)+this->width()/);
p.setY(this->height() / );
painter.setPen(colorArray[i]);
painter.drawText(p, QString(verificationCode[i]));
}
//繪制噪點
for (int j = ; j < noice_point_number; ++j) //noice_point_number噪聲點數
{
p.setX(qrand() % this->width());
p.setY(qrand() % this->height());
painter.setPen(colorArray[j % ]);
painter.drawPoint(p);
}
return;
}
//這是一個用來生成驗證碼的函數
void VerificationCodeLabel::produceVerificationCode() const
{
for (int i = ; i < letter_number; ++i)
verificationCode[i] = produceRandomLetter();
return;
}
//産生一個随機的字元
QChar VerificationCodeLabel::produceRandomLetter() const
{
QChar c;
int flag = qrand() % letter_number;
switch (flag)
{
case NUMBER_FLAG:c='0' + qrand() % ; break;
case UPLETTER_FLAG:c='A' + qrand() % ; break;
case LOWLETTER_FLAG:c='a' + qrand() % ; break;
default:c=qrand() % ? 'W' : 'D';
}
return c;
}
//産生随機的顔色
void VerificationCodeLabel::produceRandomColor() const
{
for (int i = ; i < letter_number; ++i)
colorArray[i] = QColor(qrand() % , qrand() % , qrand() % );
return;
}
//傳回一個字元串(字母一律都按照大寫傳回)
QString VerificationCodeLabel::getVerificationCode() const
{
QString s;
QChar cTemp;
for (int i = ; i < letter_number; ++i)
{
cTemp = verificationCode[i];
s += cTemp>?cTemp.toUpper():cTemp;
}
return s;
}
//重新整理驗證碼,在使用者不确定的時候進行相應重新整理
void VerificationCodeLabel::slt_reflushVerification()
{
repaint();
}
VerificationCodeLabel::~VerificationCodeLabel()
{
}
在.ui界面将對應的QLabel類對象提升為目前類即可