一、新建项目
创建一个“Qt Widget Application“项目,基类选择“QMainWindow”
二、自定义CaptchaLabel类
更改类名CaptchaLabel,添加基类QLabel,点击“下一步”
#ifndef CAPTCHALABEL_H
#define CAPTCHALABEL_H
#include <QObject>
#include <QLabel>
class CaptchaLabel : public QLabel
{
public:
explicit CaptchaLabel(QWidget* parent = nullptr);
//获取随机数
QString getRandNumber() { return m_randNumber; }
void generateRandNumber(int num = 4); //生成随机数
protected:
void paintEvent(QPaintEvent *event); //绘制
void mousePressEvent(QMouseEvent *event); //鼠标按下
private:
QString m_randNumber; //随机数
};
#endif // CAPTCHALABEL_H
#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;"); //白色背景
//随机数种子初始化
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
//生成随机数
generateRandNumber();
}
/**
* @brief CaptchaLabel::generateRandNum 生成随机数,默认是四个数
* @param num
*/
void CaptchaLabel::generateRandNumber(int num)
{
m_randNumber.clear();
for(int i = 0; i < num; i++)
{
int num = qrand() % 3;
if(num == 0) //数字
{
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(); //几个随机数
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); //若设置字体加粗,有的随机数会显示不全
QPen pen;
//绘制随机数
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的随机数
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 鼠标点击时更换随机数
* @param event
*/
void CaptchaLabel::mousePressEvent(QMouseEvent *event)
{
Q_UNUSED(event);
//重新生成验证码
generateRandNumber();
//实时更新
update();
}
三、使用自定义CaptchaLabel类
再在界面上添加一个QLineEdit和QPushButton控件,再进行垂直布局
更改代码如下
四、运行测试
输入正确的验证码(区分大小写),点击“PushButton”,输出“验证码正确”提示信息
输入错误的验证码(区分大小写),点击“PushButton”,输出“验证码错误”提示信息
原文地址:https://blog.csdn.net/Viciower/article/details/134766688
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_37502.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。