QT肝8天06--登录前验证
1、什么是登录前的信息验证
登录前的信息验证是系统在用户访问受保护资源前,通过多种方式确认用户身份的过程,其核心目标是保障账户安全和数据隐私。
常见验证方式
在Qt中实现登录前信息验证,可通过以下三种典型方案实现
基础表单验证
通过QLineEdit控件接收输入,结合槽函数进行硬编码或数据库比对验证。例如设置密码框的echoMode为Password模式,并添加水印提示文本
void LoginDialog::on_loginBtn_clicked() {if(ui->userLineEdit->text() == "username" && ui->pwdLineEdit->text() == "123456") accept();else {QMessageBox::warning(this, "警告", "用户名或密码错误!");ui->userLineEdit->clear();ui->pwdLineEdit->setFocus();}
}
验证码增强机制
为防止暴力破解,可通过QRandomGenerator生成随机字符串,使用QPainter绘制动态验证码。关键步骤包括:
- 生成4位随机字符串
- 在paintEvent中添加噪点和干扰线
- 随机化字符位置和颜色
数据库集成验证
通过QSqlDatabase连接SQLite等数据库,创建用户表存储凭证。需在.pro文件中添加QT += sql
,并实现:
- 数据库连接初始化
- 用户表创建(含username/password字段)
- 查询比对逻辑
2、开始实现登录前的信息校验
Qt中的基础表单验证主要通过结合信号槽机制完成实时校验,本登录主要有2个校验,一是非空,二是验证码比对
#include "loginwin.h"
#include "ui_loginwin.h"
#include <QPushButton>
#include <QDebug>
#include <QPainter>
#include <QRandomGenerator>LoginWin::LoginWin(QWidget *parent): QWidget(parent), ui(new Ui::LoginWin)
{ui->setupUi(this);//设置密码框的字符显示ui->editpass->setEchoMode(QLineEdit::Password);//创建基类窗体对象if(m_baseWind==nullptr){m_baseWind=new BaseWin(parent);}// m_baseWind->resize(600,200);m_baseWind->setContentWidget(this);//将当前登录窗体放到基类的内容控件中m_baseWind->setTitle("用户登录");QPushButton *login=m_baseWind->getButton();if(login==nullptr){return;}else{login->setText("登录系统");//绑定单击和槽函数connect(login,&QPushButton::clicked,this,&LoginWin::onLogin);}//初始化面板样式ui->edituser->setPlaceholderText("请输入您的帐号");ui->editpass->setPlaceholderText("请输入您的密码");ui->editcode->setPlaceholderText("请输入验证码");//默认隐藏错误提示,字体样式为红色ui->msguser->setStyleSheet("color:red");ui->msguser->hide();ui->msgpass->setStyleSheet("color:red");ui->msgpass->hide();ui->msgcode->setStyleSheet("color:red");ui->msgcode->hide();// 二维码初始化m_captcha = getCaptcha();}LoginWin::~LoginWin()
{delete ui;
}//登录
void LoginWin::onLogin()
{//获取验证码QString verCode=ui->editcode->text();//校验证用户名不能为空QString username = ui->edituser->text();if (username.isNull() || username.isEmpty()) {ui->msguser->setText("请输入用户名");ui->msguser->show();return;}//校验证密码不能为空QString password = ui->editpass->text();if (password.isNull() || password.isEmpty()) {ui->msgpass->setText("请输入密码");ui->msgpass->show();//initVerCode();return;}//校验验证码不能为空if(verCode.isNull()||verCode.isEmpty()){ui->msgcode->setText("验证码不能为空");ui->msgcode->show();return;}//校验验证码是否正确if (m_captcha.compare(verCode, Qt::CaseInsensitive)) {ui->msgcode->setText("验证码错误");ui->msgcode->show();return;} //连接数据库
}//显示窗体
void LoginWin::showLogin()
{m_baseWind->show();//调用基类的显示方法
}// 绘图--绘制验证码
void LoginWin::paintEvent(QPaintEvent *event) {QPainter painter(this);// 填充背景为白色painter.fillRect(ui->Codelab->x() + ui->widgetVer->x(),ui->Codelab->y() + ui->widgetVer->y(),ui->Codelab->width(),ui->Codelab->height(), Qt::white);// 设置字体样式painter.setFont(QFont("Lucida Console", 20, QFont::Bold));// 绘制验证码字符for (int i = 0; i < 4; i++) {QColor color = generateRandomColor(); // 随机获取颜色// 生成随机颜色QPen pen(color);pen.setWidth(1);painter.setPen(pen);painter.drawText(ui->Codelab->x() + ui->widgetVer->x() + 20 * i,ui->Codelab->y() + ui->widgetVer->y(), 20,ui->Codelab->height(), Qt::AlignCenter,QString(m_captcha[i]));}// 绘制噪点for (int i = 0; i < 400; i++) {QColor color = generateRandomColor();// 生成随机颜色QPen pen(color);pen.setWidth(1);painter.setPen(pen);painter.drawPoint(ui->Codelab->x() + ui->widgetVer->x() +(rand() % ui->Codelab->width()),ui->Codelab->y() + ui->widgetVer->y() +(rand() % ui->Codelab->height()));}// 注册事件过滤器ui->Codelab->installEventFilter(this);
}// 在字符串中随机获取四个字符
QString LoginWin::getCaptcha() {const QString possibleCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const int captchaLength = 4;QString result = "";// 生成验证码字符串for (int i = 0; i < captchaLength; ++i) {int index = QRandomGenerator::global()->bounded(possibleCharacters.length());// 生成一个0到possibleCharacters长度之间的随机整数result.append(possibleCharacters.at(index));// 将随机位置的字符添加到结果字符串中}return result;
}// 刷新验证码
void LoginWin::initVerCode() {m_captcha = getCaptcha(); // 获取新的验证码m_color = generateRandomColor(); // 生成随机颜色repaint(); // 重新绘制窗口update();ui->Codelab->setText("");
}// 随机获取颜色
QColor LoginWin::generateRandomColor() {int red = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为红色通道的值int green = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为绿色通道的值int blue = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为蓝色通道的值return QColor(red, green, blue);// 使用生成的RGB值创建并返回一个QColor对象
}// 事件过滤器
bool LoginWin::eventFilter(QObject *obj, QEvent *event) {if (event->type() == QEvent::MouseButtonPress) {if (obj == ui->Codelab) {// 初始化,重新生成验证码initVerCode();return false;}}return false;
}
3、运行效果
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,动动你的金手指,实现财务自由。