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

一、环境搭建
参考上一章环境
二、项目工程目录
在这里插入图片描述
三、主要源程序如下:
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,"修改","该账号不存在");
    }
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

针对 % 号 | 引起的 不安全情况

把网站开放的课程都检索下来了 一、情况1 org.apache.tomcat.util.http.Parameters processParameters 信息: Character decoding failed. Parameter [Mac] with value [%%%] has been ignored. Note that the name and value quoted here may be corrupted due to the failed…

陪诊陪护小程序基于ThinkPHP + FastAdmin + 微信小程序开发(源码搭建/上线/运营/售后/更新

支持多运营区&#xff0c;陪护师、推广者等完整闭环功能&#xff0c;快速搭建陪护业务平台。 消息通知&#xff1a;系统可以向用户发送订单状态变更、陪诊员信息更新等通知&#xff0c;确保用户及时了解相关信息&#xff0c;提高用户体验。 订单管理&#xff1a;患者可以查看自…

C++运算符重载(操作符重载)

运算符重载 1. 运算符重载基础1.1 运算符重载语法1.2 运算符重载细节补充1.3 更多的运算符重载 2. 重载单目运算符3. 如何直接输入输出对象类型——重载运算符 << 和 >>3.1 单个对象实现 cou <<3.2 多个对象实现 cout<<3.3 右移运算符 输入 cin >&g…

python输出希腊字母

有时候在绘制一些函数图像时&#xff0c;需要坐标轴和图例显示希腊字母 plt.xlabel(r’ ϵ \epsilon ϵ’)

土壤多参数检测仪在农业生产有哪些优势?

在现代农业的快速发展中&#xff0c;土壤多参数检测仪凭借其独特的功能和优势&#xff0c;为农业生产注入了新的活力。以下是其在农业生产中的几个显著优势&#xff1a; 一、全面精准的检测能力 土壤多参数检测仪能够全面、精准地检测土壤中的多种参数&#xff0c;如pH值、电…

【机器学习】线性回归:以房价预测为例

线性回归&#xff1a;揭秘房价预测的黑科技 一、引言二、线性回归概述三、房价预测实例数据收集与预处理特征选择与建模模型评估与优化 四、总结与展望 一、引言 在数字化时代&#xff0c;数据科学已成为推动社会进步的重要引擎。其中&#xff0c;线性回归作为数据科学中的基础…

Android 面试之Kotlin 协程上下文和异常处理

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 上下文是什么 CoroutineContext是一组用于定义协程行为的元素&#xff0c;包括以下几部分&#xff1a; Job&#xff1a;控制协程的生命周期Co…

一文讲透亚马逊云三层架构

关于三层架构&#xff0c;我们有很多想说的话&#xff1a; &#xff08;以下内容以下都在VPC中&#xff09; cloudfront做CDN加速网关规划S3做静态网站托管APIGateway作为统一网关入口认证/限流Lambda 作为传统后端&#xff0c;并发&#xff0c;底层架构Redis缓存DDB作为持久化…

Excel 根据分类及组内序号进行编码

例题描述和简单分析 Excel 记录课程数据&#xff0c;未排序&#xff0c;部分如下&#xff1a; ABC1CourseDateTime2Word1-Sep-209:003Word1-Sep-209:004PowerPoint1-Sep-209:005Word1-Sep-2012:006PowerPoint1-Sep-2012:007Excel1-Sep-2012:008Word1-Sep-2012:00 现在要新增…

发布一个属于自己的 npm工具包

我们可以发布一个属于自己的工具包到 npm 服务上&#xff0c;方便自己和其他开发者使用&#xff0c;参与社区贡献&#xff0c;操作步骤如下&#xff1a; 创建与发布 npm 初始化工具包&#xff0c;package.json 填写包的信息 (包的名字是唯一的)注册账号 https://www.npmjs.co…

13.跳跃游戏

文章目录 题目简介题目解答解法一&#xff1a;贪心算法&#xff0b;动态规划代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 跳跃游戏面试题 相关的讲解&#xff01;&#x1f600; 题目简介 题目解答 思路&#xff1a;这…

Django开发实战之定制管理后台界面及知识梳理(中)

上一篇文章末尾讲到如何能够展示更多的字段在界面上&#xff0c;那么针对整个界面数据&#xff0c;如果我想按照某一个条件进行筛选&#xff0c;我该怎么做呢&#xff0c;只需要加上下面一行代码 注意&#xff1a;中途只有代码片段&#xff0c;文末有今天涉及的所有代码 1、增…

RabbitMQ高级(MQ的问题,消息可靠性,死信交换机,惰性队列,MQ集群)【详解】

目录 一、MQ的问题 1. 问题说明 2. 准备代码环境 1 创建project 2 创建生产者模块 3 创建消费者模块 二、消息可靠性 1. 介绍 2. 生产者确认机制 3. MQ消息持久化 4. 消费者确认机制 5. 消费者auto模式的失败重试 6. 小结 三、死信交换机和延迟消息 1. 介绍 2. …

【前端部署】Ubuntu22.04 使用nginx部署vue前端项目教程

一.ubuntu安装nginx 1.更新本地软件包列表 sudo apt update2.安装nginx sudo apt install nginx3.验证nginx是否安装成功 sudo systemctl status nginx如果Nginx正在运行&#xff0c;则命令输出应该显示Active&#xff08;active (running)&#xff09;状态。 4.若nginx未运…

【MySQL】——课程平台的创建设计

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

2024HW Linux应急响应基础学习

首先展示关于Linux的关键目录&#xff0c;这是应急响应查看的关键&#xff1a; 常用命令 top //查看进程资源的占用情况 ps -aux //查看进程 直接写ps aux也可以 netstat -antpl //查看网络连接 ls -alh /proc/pid //查看某个pid对应的可执行程序 pid记得修改 lsof /…

微信登录功能--网站应用

微信开发平台注册https://open.weixin.qq.com/ 账号中心-填写基本资料&#xff08;最好是公司注册&#xff09; 账号中心-开发者资质认证&#xff08;充钱&#xff0c;300&#xff09; 审核通过之后&#xff0c;管理中心-网站应用-创建网站应用&#xff08;AppSecret一定一定…

SMART700西门子触摸屏维修6AV6 648-0CC11-3AX0

西门子工控机触摸屏维修系列型号&#xff1a;PС477,PC677,TD200,TD400,KTP178,TP170A,TP170B,TP177A,TP177B,TP270,TP277,TP27,MP370,MP277,OP27,OP177B等。 触摸屏故障有&#xff1a;上电黑屏, 花屏,暗屏,触摸失灵,按键损坏,电源板,高压板故障,液晶,主板坏等,内容错乱、进不了…

nacos server安装部署傻瓜级教程

下载地址&#xff1a;GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.an easy-to-use dynamic service discovery, configuration and service management platfo…

C++ 搜索二叉树

目录 1.二叉搜索树概念 2. 实现二叉搜索树 2.1. 二叉搜索树的插入 2.2查找 2.3删除节点 3.二叉树的应用&#xff08;KV结构&#xff09; 1.二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为…