当前位置: 首页 > news >正文

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绘制动态验证码。关键步骤包括:

  1. 生成4位随机字符串
  2. 在paintEvent中添加噪点和干扰线
  3. 随机化字符位置和颜色

数据库集成验证

通过QSqlDatabase连接SQLite等数据库,创建用户表存储凭证。需在.pro文件中添加QT += sql,并实现:

  1. 数据库连接初始化
  2. 用户表创建(含username/password字段)
  3. 查询比对逻辑

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、运行效果

          

          

          

原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,动动你的金手指,实现财务自由。

http://www.dtcms.com/a/431531.html

相关文章:

  • 网站开发实战演练城乡村建设规划许可证网站
  • 网站的小图标怎么做的做网站能赚吗
  • 北京房产网站大全如何创建网站教程
  • 电商网站的建设步骤国外室内设计网站排名
  • mount --path
  • dify离线安装
  • 【完整源码+数据集+部署教程】 运动员动作分割系统: yolov8-seg-GFPN
  • 在线教育网站开发实例电商设计是什么意思
  • 潮州网站建设公司网站欣赏与创建网页
  • 27.渗透-.Linux基础命令(十九)-Linux系统状态管理(安全加固-禁止whell组以外的用户使用su root)
  • 2008iis7怎么搭建网站手机网上银行
  • AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
  • 南山商城网站建设多少钱广告设计与制作是做什么的
  • React18学习笔记(四) 路由案例--记账本
  • display ospf lsdb 概念及题目
  • 做爰全过程免费的视网站郑州汉狮做网站的大公司
  • 前端网站大全gps建站步骤
  • python基础语法速通
  • 中国地级市旅游人数、收入数据(2000-2023年)
  • 计算机毕设做网站难吗广州seo托管
  • 高端网站设计如何兼顾美学与转化率?
  • 软件下载网站如何履行安全管理义务确保提供的软件广州冼村为什么有钱
  • 嵌入式开发笔记(1)
  • 泉州 网站建设公司首选北京海淀区的科技有限公司
  • 数字化先期质量策划:论全星APQP系统对传统PLM理念的超越与重塑
  • C++lambda函数
  • 第 5 天:C 语言运算符与表达式 —— 数据处理的工具集
  • [深度学习] 大模型学习5-高效微调框架Unsloth使用指北
  • 家教网站代理做彩票网站是违法的吗
  • 南康网站建设wplms wordpress