QT 小项目:登录注册账号和忘记密码(下一章实现远程登录)

news2024/9/29 11:38:06

一、环境搭建
参考上一章环境
二、项目工程目录
在这里插入图片描述
三、主要源程序如下:
registeraccountwindow.cpp
窗口初始化:

void registeraccountWindow::reginit()
{
    //去掉?号
    this->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
    //更改名称
    this->setWindowTitle("register");
    //更换左上角图标
    this->setWindowIcon(QIcon(":/image/logol.png"));//生成窗口图标
    //禁止改变窗口大小 固定大小
    this->setFixedSize(408,270);
    //设置样式
    ui->lineEdit_registeraccount->setStyleSheet("QLineEdit{border-width:1px;border-radius:4px;font-size:12px;color:black;border:1px solid gray;}"
           "QLineEdit:hover{border-width:1px;border-radius:4px;font-size:16px;color:black;border:1px solid rgb(204,38,200);}");//边框宽度 边框圆角 字体大小 ...   选中边框颜色
    ui->lineEdit_registerpassword->setStyleSheet("QLineEdit{border-width:1px;border-radius:4px;font-size:12px;color:black;border:1px solid gray;}"
           "QLineEdit:hover{border-width:1px;border-radius:4px;font-size:12px;color:black;border:1px solid rgb(70,200,50);}");
    ui->lineEdit_regosterpassword_ok->setStyleSheet("QLineEdit{border-width:1px;border-radius:4px;font-size:12px;color:black;border:1px solid gray;}"
           "QLineEdit:hover{border-width:1px;border-radius:4px;font-size:12px;color:black;border:1px solid rgb(0,18,154);}");
    //设置密码框-密文登录
    ui->lineEdit_registerpassword->setEchoMode(QLineEdit::Password);
    ui->lineEdit_regosterpassword_ok->setEchoMode(QLineEdit::Password);
    //密码的隐藏和显示
    // 设置样式表(图片为眼睛样式)
    ui->checkBox_eye1->setStyleSheet("QCheckBox {spacing: 5px;border: none;background-color: transparent;}"
    "QCheckBox::indicator {width: 20px;height: 20px;border: none;image: url(:/image/close_eye.png);}"
    "QCheckBox::indicator:checked {image: url(:/image/open_eye.png);}");
    ui->checkBox_eye2->setStyleSheet("QCheckBox {spacing: 5px;border: none;background-color: transparent;}"
    "QCheckBox::indicator {width: 20px;height: 20px;border: none;image: url(:/image/close_eye.png);}"
    "QCheckBox::indicator:checked {image: url(:/image/open_eye.png);}");
    //提示信息
    ui->lineEdit_registeraccount->setPlaceholderText("请输入设置的用户名 格式10位以内的数字");
    ui->lineEdit_registerpassword->setPlaceholderText("请输入设置的密码 格式15位以内的数字") ;
    ui->lineEdit_regosterpassword_ok->setPlaceholderText("请再次输入设置的密码 格式15位以内的数字");
    ui->lineEdit_checkcode->setPlaceholderText("请输入验证码");
    //返回主界面按钮样式  背景透明等
    ui->pushButton_back->setStyleSheet("QPushButton {"
                                                  "  background-color: transparent;"
                                                  "  border: none;"
                                                  "  color:rgb(255, 255, 255)"
                                                  "}"
                                                  "QPushButton:hover{color:rgb(15, 23, 253)}"
                                                  "QPushButton:pressed{color:rgb(255, 44, 221)}"
                                                  );
     //验证码按键样式
     ui->pushButton_checkcode->setStyleSheet("QPushButton {"
                                           "  background-color: transparent;"
                                           "  border: none;"
                                           "}"
                                           "QPushButton:pressed { background-color: none; }"  // 移除按键被按下时的视觉效果
                                           "QPushButton:hover { background-color: none; }"   // 移除鼠标悬停时的视觉效果
                                           );
     //获取验证码
     m_captcha = getCaptcha();
     //生成随机颜色
     m_color = generateRandomColor();


}

返回登录页面:

void registeraccountWindow::on_pushButton_back_clicked()
{

    this->close();
    lo->show();
}

注册按钮及其相关函数:

void registeraccountWindow::on_pushButton_register_clicked()
{

    lo->connent_mysql();
    //获取内容
    QString reg_account = ui->lineEdit_registeraccount->text();
    QString reg_password = ui->lineEdit_registerpassword->text();
    QString reg_password_ok = ui->lineEdit_regosterpassword_ok->text();
    QString check_code = ui->lineEdit_checkcode->text().replace(" "," ");//去除空格

    QSqlQuery query;
    //查询数据库的所有账户 避免重复
    QString qs_temp = QString("select * from os_user where account = '%1'").arg(reg_account);
//    qDebug() << query.next();
    query.exec(qs_temp);
    if(query.next()){          //获取查询结果集
    QMessageBox::information(this,"注册","账号已经被注册");
    }
    else
    {
        if(reg_password_ok==reg_password)  //两次输入的密码一致
        {
            if(check_code.toLower() == m_captcha.toLower())  //用户输入的验证码与生成的验证码比较
            {
                QString qs = QString("insert into os_user(account,pwd)"
                                      "values(%1, %2)"
                                     ).arg(reg_account).arg(reg_password);
                if(!query.exec(qs)){          //获取查询结果集
                 QMessageBox::information(this,"注册","注册失败");
                 }
                else
                 {
                 QMessageBox::information(this,"注册","注册成功");
                 }
            }
            else
            {
                QMessageBox::warning(this, "Warning", "验证码输入错误");
            }

        }
        else
        {
            QMessageBox::warning(this, "Warning", "两次输入的密码不一致");
        }
    }
}

QColor registeraccountWindow::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对象

}
void registeraccountWindow::paintEvent(QPaintEvent *event)
{
       QPainter painter(this);//直接绘制在该窗口上

       // 填充背景为白色
       painter.fillRect(ui->label_checkcode->x()+ui->widget->x(), ui->label_checkcode->y()+ui->widget->y(), ui->label_checkcode->width(), ui->label_checkcode->height(), Qt::white);

       // 设置字体样式
       painter.setFont(QFont("Lucida Console", 18,QFont::Bold));

       // 绘制验证码字符
       for(int i = 0; i < 4; i++)
       {
           QColor color = generateRandomColor();
           // 生成随机颜色
           QPen pen(color);
           pen.setWidth(1);  //画笔宽度
           painter.setPen(pen);//相当于将画笔交给画家
           painter.drawText(ui->label_checkcode->x() +ui->widget->x()+ 30*i, ui->label_checkcode->y()+ui->widget->y(), 30, ui->label_checkcode->height(), Qt::AlignCenter,
                            QString(m_captcha[i]));//1,2,3,4绘制文本的矩形区域 文本的对齐方式 文本内容
                            // 绘制验证码字符

       }
       // 绘制噪点
           for(int i=0; i<1500; i++)
           {
               QColor color = generateRandomColor();
               // 生成随机颜色
               QPen pen(color);
               pen.setWidth(1);
               painter.setPen(pen);
               painter.drawPoint(ui->label_checkcode->x()+ui->widget->x()+ (qrand() % ui->label_checkcode->width()), ui->label_checkcode->y()+ui->widget->y() + (qrand() % ui->label_checkcode->height()));
               //保证随机数的坐标在矩形区域内

           }

//           // 绘制干扰线
//           for(int i = 0;i < 10;++i)
//           {
//               painter.drawLine(ui->label_checkcode->x()+ui->widget->x()+qrand()%ui->label_checkcode->width(),ui->label_checkcode->y()+ui->widget->y()+qrand()%ui->label_checkcode->height(),
//                                ui->label_checkcode->x()+ui->widget->x()+qrand()%ui->label_checkcode->width(),ui->label_checkcode->y()+ui->widget->y()+qrand()%ui->label_checkcode->height());
//           }



}

QString registeraccountWindow::getCaptcha()
{
    const QString possibleCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    const int captchaLength = 4;
    QString result = "";

    // 生成验证码字符串
    for (int i = 0; i < captchaLength; ++i) {   //控制生成4位的字符串
        int index = QRandomGenerator::global()->bounded(possibleCharacters.length());  //QRandomGenerator随机数生成器 QRandomGenerator::global()指针变量 返回创建的随机数指针 bounded(给定随机数生成的范围)
        // 生成一个0到possibleCharacters长度之间的随机整数
        result.append(possibleCharacters.at(index));
        // 将随机位置的字符添加到结果字符串中
    }

    return result; // 返回生成的验证码字符串

}

registeraccontwindow.h

#ifndef REGISTERACCOUNTWINDOW_H
#define REGISTERACCOUNTWINDOW_H
#include "login.h"
#include <QDialog>

namespace Ui {
class registeraccountWindow;
}

class registeraccountWindow : public QDialog
{
    Q_OBJECT

public:
    explicit registeraccountWindow(QWidget *parent = nullptr);
    ~registeraccountWindow();

    QString m_captcha;

    QColor m_color;

    login *lo = new login;

    void reginit();

    void paintEvent(QPaintEvent *event);

    QColor generateRandomColor();

    QString getCaptcha();

private slots:
    void on_pushButton_back_clicked();

    void on_pushButton_register_clicked();

    void on_pushButton_checkcode_clicked();

    void on_checkBox_eye1_stateChanged(int arg1);

    void on_checkBox_eye2_stateChanged(int arg1);

private:
    Ui::registeraccountWindow *ui;
};

#endif // REGISTERACCOUNTWINDOW_H

forgetpasswordwindow.cpp

修改密码功能:

void forgetpasswordwindow::on_pushButton_forget_clicked()
{
    lo_forget->connent_mysql();
    //获取内容
    QString forget_account = ui->lineEdit_forgetaccount->text();
    QString forget_password = ui->lineEdit_forgetpassword->text();

    QSqlQuery query;
    //查询数据库的所有账户 是否有该账号
    QString qs = QString("select * from os_user where account = '%1'").arg(forget_account);

    query.exec(qs);//执行SQL语句

    if(query.next()){          //获取查询结果集
        QString qs = QString("UPDATE os_user SET pwd = '%1' WHERE account = '%2'" ).arg(forget_password).arg(forget_account);
        query.exec(qs);//执行SQL语句
        if(!query.exec(qs))
        {
            QMessageBox::information(this,"修改","修改密码失败");
        }
        else
        QMessageBox::information(this,"修改","修改密码成功");
    }
    else
    {
      QMessageBox::information(this,"修改","该账号不存在");
    }
}

四、实现效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:点击验证码的位置即可刷新验证码

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1662851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《数据结构与算法之美》学习笔记一

前言&#xff1a;今天开始学习极客时间的课程《数据结构与算法之美》。为撒要学习这个&#xff1f;因为做力扣题太费劲了&#xff0c;自己的基础太差了&#xff01;所以要学习学习。开一个系列记录一下学习笔记。认真学吧&#xff0c;学有所获才不负韶华&#xff01;之前就学过…

【bug记录】Vue3 Vant UI 中 van-popup 不弹出

原因&#xff1a;语法使用错误&#xff0c;使用了 Vue 2 的语法 Vue3语法&#xff1a; Vue2语法&#xff1a;

JAVA IO/NIO 知识点总结

一、常见 IO 模型简介 1. 阻塞IO模型 最传统的一种IO模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后&#xff0c;内核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线…

企业微信创建应用(一)

登录到企业微信后台管理(https://work.weixin.qq.com/)进入自建应用(应用管理-应用-创建应用) 3.查看参数AgentId和 Secret 4.企业微信查看效果

致远M3 Session 敏感信息泄露漏洞复现

0x01 产品简介 M3移动办公是致远互联打造的一站式智能工作平台,提供全方位的企业移动业务管理,致力于构建以人为中心的智能化移动应用场景,促进人员工作积极性和创造力,提升企业效率和效能,是为企业量身定制的移动智慧协同平台。 0x02 漏洞概述 致远M3 server多个日志文…

我国吻合器市场规模不断扩大 国产化率有所增长

我国吻合器市场规模不断扩大 国产化率有所增长 吻合器是替代手工切除或缝合的一种医疗器械&#xff0c;其工作原理与订书机十分相似&#xff0c;可利用钛钉对组织进行离断或吻合。经过多年发展&#xff0c;吻合器种类逐渐增多&#xff0c;根据手术方式不同&#xff0c;吻合器大…

uni-app(二):本地插件使用(Android)

本地插件使用 项目创建等参考1.下载并引用本地插件2.注意插件配置3.制作自定义基座4.编写调用代码5.运行 项目创建等参考 https://lprosper.blog.csdn.net/article/details/138655526 1.下载并引用本地插件 2.注意插件配置 3.制作自定义基座 4.编写调用代码 <template>…

前端动画requestAnimationFrame

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画&#xff0c;并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数&#xff0c;该回调函数会在浏览器下一次重绘之前执行。 备注&#xff1a; 若你想在浏览器下次重绘…

从头理解transformer,注意力机制(上)

深入理解注意力机制和Transformer架构&#xff0c;及其在NLP和其他领域的突破。 要想理解transformer&#xff0c;先从编码器解码器结构开始理解 基于transformer发展起来的llm 右边&#xff1a;只有解码器&#xff0c;强项是生成内容 左边&#xff1a;只有编码器&#xff0…

每日OJ题_贪心算法四②_力扣435. 无重叠区间

目录 力扣435. 无重叠区间 解析代码 力扣435. 无重叠区间 435. 无重叠区间 难度 中等 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2]…

完整版解答!2024年数维杯数学建模挑战赛B题

B题 生物质和煤共热解问题的研究 技术文档第一问1.1问题一分析1.2数据预处理1.3问题一Spearman相关性分析 数据代码资料获取 技术文档 第一问 1.1问题一分析 对于问题一&#xff0c;题目要求分析出正己烷不溶物对焦油产率、水产率、焦渣产率这三个指标是否有显著影响&#x…

1689 ssm社区老人危机干预系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm社区老人危机干预系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

解决 git 因输入密码错误而导致的报错无法推送问题

报错内容如下&#xff1a; > git push origin master:master fatal: unable to access https://gitee.com/spring-in-huangxian-county/web-tts-vue.git/: OpenSSL SSL_connect: Connection was reset in connection to gitee.com:443 出错原因 根本原因是本机存储的 账户…

面试中算法(删去n个数字后的最小值)

有一个整数&#xff0c;从该整数中去掉n个数字&#xff0c;要求剩下的数字形成的新整数尽可能小。 分析&#xff1a;使用栈的特性&#xff0c;在遍历原整数的数字时&#xff0c;让所有数字一个一个入栈&#xff0c;当某个数字需要被删除时&#xff0c;&#xff08;即栈顶数字&g…

麦肯锡专访 Mistral AI CEO:三五年后的工作,要比现在更有意义

【编者按】总部位于巴黎的人工智能初创公司 Mistral AI 成立仅一年&#xff0c;就被誉为现有大模型巨头的有力挑战者。 今年 2 月&#xff0c;Mistral AI 正式发布了旗舰级大模型 Mistral Large&#xff0c;直接对标 OpenAI 的 GPT-4&#xff1b;几周前&#xff0c;Mistral AI…

报表控件Stimulsoft指南:在 JavaScript 报告工具中使用节点计划

我们最近发布了一篇关于使用Quartz.NET 库自动执行报告任务的文章。继续这个主题&#xff0c;今天我们将深入探讨我们的报告如何与 Node Schedule 作业调度程序集成。 Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用…

环保访谈|浙江双视专注红外机器视觉及智能化应用,保障安全生产

近期&#xff0c;中联环保圈希姐采访了浙江双视科技股份有限公司环保行业销售总监孙波&#xff0c;深入了解了双视科技的发展历程、产品和解决方案、合作流程、核心竞争力以及未来规划。 双视于2014年创立&#xff0c;专注于红外机器视觉、人工智能技术与应用开发&#xff0c;…

信息化系统建设运维服务方案(投标)Word原件

《信息化系统运维服务方案》&#xff08;原件可获取&#xff09; 1.项目情况 2.服务简述 2.1服务内容 2.2服务方式 2.3服务要求 2.4服务流程 2.5工作流程 2.6业务关系 2.7培训 3.资源提供 3.1项目组成员 3.2服务保障 软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任…

Python作业三:扫描目录文件,发送到指定邮箱

问&#xff1a; 作业任务&#xff1a;编写python代码&#xff0c;扫描指定的目录下的所有文件&#xff0c;将这些扫描的文本内容邮件发送到指定邮箱(如&#xff1a;自己的qq邮箱) 发送邮箱&#xff1a;yagmail 以 163 邮箱为例&#xff0c;在编码之前&#xff0c;我们需要开…

MMdetection在Featurize服务器运行时相关问题

写点闲话&#xff1a; 之前因为毕业&#xff0c;想写代码再也没有稳定的机子跑了&#xff0c;自己电脑有时候也带不动&#xff0c;所以开始使用Featurize&#xff0c;这里可以租一些显卡来用&#xff0c;价格总体来说对我们这种偶尔有大规模算力需求的打工人非常友好。使用方法…