QT用户登录注册,数据库实现

news2024/12/23 19:27:13

登录窗口头文件

#ifndef LOGINUI_H
#define LOGINUI_H

#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QMessageBox>

#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery>    //执行sql语句的类
#include <QSqlRecord>   //数据库记录类

#include <QKeyEvent>

#include "client.h"

class LoginUI : public QWidget
{
    Q_OBJECT

private:
    //标签类组件
    QLabel* Background_Lab;
    QLabel* Titile_Lab;
    QLabel* Username_Lab;
    QLabel* Password_Lab;

    //按钮类组件
    QPushButton* Close_Btn;
    QPushButton* Hide_Btn;
    QPushButton* Login_Btn;
    QPushButton* Register_Btn;

    //行编辑器类组件
    QLineEdit* Username_Edit;
    QLineEdit* Password_Edit;

    //声明数据库对象
    QSqlDatabase db;

    //UI绘制函数
    bool DrawLoginUI();

    //构造函数
    LoginUI();
    bool construct();

private slots:
    //槽函数
    void On_CloseBtn_Clicked();
    void On_Loginbtn_Slots();
    void On_Registerbtn_Slots();


public:
    //实例化对象
    static LoginUI* NewInstance();
    void show();
    ~LoginUI();

signals:
    void jump();



};
#endif //LOGINUI_H

登录窗口函数实现

#include "LoginUI.h"
#include <QDebug>


bool LoginUI::DrawLoginUI()
{
    bool ret = true;

    //背景色设置
    Background_Lab = new QLabel(this);

    if( Background_Lab != nullptr)
    {
        Background_Lab->resize(538, 160);
        Background_Lab->setStyleSheet("background-color:rgb(115,70,240)");
    }
    else
    {
        ret = false;
    }

    //窗口标识
    Titile_Lab = new QLabel(this);

    if( Titile_Lab != nullptr )
    {
        Titile_Lab->resize(90, 50);
        Titile_Lab->setPixmap(QPixmap(":/QT_Icon/QQ_Icon.png"));
        Titile_Lab->setScaledContents(true);
    }
    else
    {
        ret = false;
    }

    //关闭按键
    Close_Btn = new QPushButton(this);

    if( Close_Btn != nullptr )
    {
        Close_Btn->resize(20, 20);
        Close_Btn->setIcon(QIcon(":/QT_Icon/close02.png"));
        Close_Btn->move(508, 10);
        connect(this->Close_Btn, &QPushButton::clicked, this, &LoginUI::On_CloseBtn_Clicked);
    }
    else
    {
        ret = false;
    }

    //隐藏按键
    Hide_Btn = new QPushButton(this);

    if( Hide_Btn != nullptr )
    {
        Hide_Btn->resize(20, 20);
        Hide_Btn->setIcon(QIcon(":/QT_Icon/hide02.png"));
        Hide_Btn->move(468, 10);
        connect(this->Hide_Btn, &QPushButton::clicked, this, &LoginUI::hide);
    }
    else
    {
        ret = false;
    }

    //用户名输入栏
    Username_Edit = new QLineEdit(this);

    if( Username_Edit != nullptr )
    {
        Username_Edit->resize(260, 40);
        Username_Edit->move(159, 173);
        Username_Edit->setMaxLength(16);
        Username_Edit->setPlaceholderText("QQ账号/手机号/邮箱");
    }
    else
    {
        ret = false;
    }

    //密码输入栏
    Password_Edit = new QLineEdit(this);

    if( Password_Edit != nullptr )
    {
        Password_Edit->resize(260, 40);
        Password_Edit->move(Username_Edit->x(), Username_Edit->y()+60);
        Password_Edit->setEchoMode(QLineEdit::Password);
        Password_Edit->setMaxLength(16);
    }
    else
    {
        ret = false;
    }

    //用户名输入栏标签
    Username_Lab = new QLabel(this);

    if( Username_Lab != nullptr )
    {
        Username_Lab->resize(30, 30);
        Username_Lab->move(Username_Edit->x()-40, Username_Edit->y()+5);
        Username_Lab->setPixmap(QPixmap(":/QT_Icon/windos_icon1.png"));
        Username_Lab->setScaledContents(true);
    }
    else
    {
        ret = false;
    }

    //密码输入栏标签
    Password_Lab = new QLabel(this);

    if( Password_Lab != nullptr )
    {
        Password_Lab->resize(30, 30);
        Password_Lab->move(Password_Edit->x()-40, Password_Edit->y()+5);
        Password_Lab->setPixmap(QPixmap(":/QT_Icon/password.png"));
        Password_Lab->setScaledContents(true);
    }
    else
    {
        ret = false;
    }

    //登录按键
    Login_Btn = new QPushButton("登录",this);

    if( Login_Btn != nullptr )
    {
        Login_Btn->resize(130, 40);
        Login_Btn->setStyleSheet("background-color:rgb(8,189,253);");
        Login_Btn->move(Password_Lab->x(), Password_Lab->y()+60);
        connect(this->Login_Btn, &QPushButton::clicked, this, &LoginUI::On_Loginbtn_Slots);
    }
    else
    {
        ret = false;
    }

    //注册按键
    Register_Btn = new QPushButton("注册",this);

    if( Register_Btn != nullptr )
    {
        Register_Btn->resize(130, 40);
        Register_Btn->setStyleSheet("background-color:rgb(8,189,253);");
        Register_Btn->move(Login_Btn->x()+170, Login_Btn->y());
        connect(this->Register_Btn, &QPushButton::clicked, this, &LoginUI::On_Registerbtn_Slots);
    }
    else
    {
        ret = false;
    }

    return ret;
}

LoginUI::LoginUI(): QWidget(nullptr, Qt::WindowCloseButtonHint)
{
}



void LoginUI::show()
{
    setWindowFlag(Qt::FramelessWindowHint);

    setFixedSize(538, 373);

    QWidget::show();
}


LoginUI::~LoginUI()
{
}

//构造函数
bool LoginUI::construct()
{

    //UI界面绘制
    bool ret = true;

    ret = DrawLoginUI();


    //数据库创建
    //判断自己的数据库对象中,是否包含要处理的数据库,没有则添加一个数据库
    if( !db.contains("UserMsg.db"))
    {
        //添加一个数据库,调用该类中的静态成员函数addDatabase()
        db = QSqlDatabase::addDatabase("QSQLITE");//使用sqlite3数据库

        //设置数据库名字
        db.setDatabaseName("UserMsg.db");
    }

    //此时数据库已经创建完成
    //打开数据库
    if( !db.open() )
    {
        QMessageBox::information(this, "提示", "数据库打开失败");
        ret = false;
    }

    //使用sql语句进行创建表的操作
    //准备sql语句
    QString Create_Table_Sql = "create table if not exists user_msg("
                               "user_name varchar(16) primary key,"
                               "password varchar(16))";


    //准备语句执行者
    QSqlQuery querry;

    //执行sql语句
    if( !querry.exec(Create_Table_Sql) )
    {
        QMessageBox::information(this, "提示", "创建表失败");
        ret = false;
    }

    return ret;

}

//关闭按键槽函数
void LoginUI::On_CloseBtn_Clicked()
{
    QMessageBox box(QMessageBox::Question, "关闭", "您确定要退出?", QMessageBox::Yes | QMessageBox::No, this);
    box.setDefaultButton(QMessageBox::No);

    int ret = box.exec();

    if(ret == QMessageBox::Yes)
    {
        this->close();
    }
    else if(ret == QMessageBox::No)
    {

    }
}

//登录按键槽函数
void LoginUI::On_Loginbtn_Slots()
{
    //获取ui界面的用户信息
    QString name = Username_Edit->text();
    QString password = Password_Edit->text();

    if( name.isEmpty() )
    {
        QMessageBox::information(this, "提示", "请输入用户名");
        return;
    }
    else if( password.isEmpty() )
    {
        QMessageBox::information(this, "提示", "请输入密码");
        return;
    }

    //准备sql查询语句
    QString sql = QString("select * from user_msg where user_name = '%1' and password = '%2'").arg(name).arg(password);

    //准备语句执行者
    QSqlQuery querry;
    querry.exec(sql);

//    qDebug() <<querry.exec(sql);

//    qDebug() << querry.value(0);
//    qDebug() << querry.value(1);

    //执行sql语句
    if( !querry.next() )
    {
        QMessageBox::information(this, "提示", "账号密码错误");
        return;
    }
    else
    {

        QMessageBox::information(this, "提示", "登陆成功");
        emit jump();
        this->close();

    }

}

//注册事件槽函数
void LoginUI::On_Registerbtn_Slots()
{
    //获取ui界面的用户信息
    QString name = Username_Edit->text();
    QString password = Password_Edit->text();

    //确保用户信息输入完整
    if( name.isEmpty() || password.isEmpty() )
    {
        QMessageBox::information(this, "提示", "请将信息填写完整");
        return;
    }

    //准备sql语句
    QString sql = QString("insert into user_msg(user_name, password) "
                          "values('%1', '%2')").arg(name).arg(password);

    //准备语句执行者
    QSqlQuery querry;
    if( !querry.exec(sql) )
    {
        QMessageBox::information(this, "提示", "注册失败");
        return;
    }
    else
    {
        QMessageBox::information(this, "提示", "注册成功");
    }
}


//创建一个新对象
LoginUI *LoginUI::NewInstance()
{
    LoginUI* ret = new LoginUI;

    if( !ret->construct() || ret == nullptr )
    {
        delete ret;

        ret = nullptr;
    }


    return ret;
}

在这里插入图片描述

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

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

相关文章

【力扣每日一题】2023.9.28 花期内花的数目

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个二维数组来表示花期&#xff0c;在一段花期之内花是开的。另外给我们一个一维数组表示来人的时间&#xff0c;要我们返回一个一…

使用Vue3+elementPlus的Tree组件实现一个拖拽文件夹管理

文章目录 1、前言2、分析3、实现4、踩坑4.1、拖拽辅助线的坑4.2、数据的坑4.3、限制拖拽4.4、样式调整 1、前言 最近在做一个文件夹管理的功能&#xff0c;要实现一个树状的文件夹面板。里面包含两种元素&#xff0c;文件夹以及文件。交互要求如下&#xff1a; 创建、删除&am…

三子棋小游戏(简单详细)

设计总体思路 实现游戏可以一直玩&#xff0c;先打印棋盘&#xff0c;玩家和电脑下棋&#xff0c;最后分出胜负。 如果编写较大的程序&#xff0c;我们可以分不同模块 例如这个三子棋&#xff0c;我们可以创建三个文件 分别为&#xff1a; game.h 函数的声明game.c 函数…

求臻医学:乳腺癌治疗与基因检测 探索个性化医疗的未来

乳腺癌是全球女性最常见的恶性肿瘤&#xff0c;2020年全球新发乳腺癌病例约为230万&#xff0c;发病率超过肺癌&#xff0c;位居全部恶性肿瘤首位&#xff01;本文将为您总结乳腺癌的治疗策略与基因检测&#xff0c;揭示个性化医疗的重要意义。 乳腺癌的诊疗 早期乳腺癌通常不…

小程序echarts折线图去除圆圈

如图&#xff0c;默认的折线图上面是有圆圈的&#xff0c;鼠标放上去或者手指触摸的话会有对应的文字出现&#xff0c;但很多时候我们不需要这个圆圈&#xff0c;怎么办呢&#xff0c;其实很简单&#xff0c;只要在 series 中设置属性 showSymbol 为false 就好啦 symbol: none,…

SpringCloud Gateway--Predicate/断言(详细介绍)下

&#x1f600;前言 本篇博文是关于SpringCloud Gateway–Predicate/断言&#xff08;详细介绍&#xff09;下&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以…

(三)Python变量类型和运算符

所有的编程语言都支持变量&#xff0c;Python 也不例外。变量是编程的起点&#xff0c;程序需要将数据存储到变量中。 变量在 Python 内部是有类型的&#xff0c;比如 int、float 等&#xff0c;但是我们在编程时无需关注变量类型&#xff0c;所有的变量都无需提前声明&#x…

从C语言到C++:C++入门知识(2)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关C的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

云原生之使用Docker部署PDF多功能工具Stirling-PDF

云原生之使用Docker部署PDF多功能工具Stirling-PDF 一、Stirling-PDF介绍1.1 Stirling-PDF简介1.2 Stirling-PDF功能 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Stirli…

全网最全面最精华的设计模式讲解,从程序员转变为工程师的第一步

前言 现代社会&#xff0c;技术日新月异&#xff0c;要想跟上技术的更新就必须不断学习&#xff0c;而学习技术最有效方式就是阅读优秀的源码&#xff0c;而优秀的源码都不是简单的逻辑堆积&#xff0c;而是有很灵活的设计模式应用其中&#xff0c;如果我们不懂设计模式&#…

移动机器人运动规划 --- 基于图搜索的A*算法

移动机器人运动规划 --- 基于图搜索的A*算法 A*算法A*算法伪代码A* 算法步骤示例A*算法分析启发函数设计 A*应用的更好方式 A*算法 A算法与Dijkstra算法的框架是完全一样的&#xff0c;**A算法就是有启发性的Dijkstra算法** 代价函数&#xff1a;g(n) 表示的是从开始节点到当…

python tempfile模块:生成临时文件和临时目录

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 tempfile 模块专门用于创建临时文件和临时目录&#xff0c;它既可以在 UNIX 平台上运行良好&#xff0c;也可以在 Windows 平台上运行良好。 tempfile 模块中常用…

蓝牙技术|蓝牙在物联网产品上的功能,特别是苹果Find My中的应用

蓝牙技术经历了不同的迭代&#xff0c;引入了新功能和改进。最初的蓝牙版本于1999年推出。低功耗蓝牙(BLE)&#xff0c;也称为蓝牙4.0或蓝牙智能&#xff0c;于2010年发明&#xff0c;旨在最大限度地降低功耗。这使得它非常适合使用电池供电的物联网设备&#xff0c;从而延长电…

私有继承和虚函数私有化能用么?

源起 以前就知道private私有化声明关键字&#xff0c;和virtual虚函数关键字两者并不冲突&#xff0c;可以同时使用。 但是&#xff0c;它所表示的场景没有那么明晰&#xff0c;也觉得难以理解&#xff0c;直到近段时间遇到一个具体场景。 场景 借助ACE遇到的问题进行展示 …

深眸科技入局AI视觉行业,以深度学习赋能视觉应用推进智造升级

随着科技的飞速发展&#xff0c;人工智能技术已经成为改变我们生活的重要力量&#xff0c;而深度学习作为人工智能的一个重要分支&#xff0c;近年来随着卷积神经网络的突破和推广&#xff0c;取得了显著进展&#xff0c;并呈现爆发式增长势头。 目前AI技术已经被迅速引入到机…

数据集笔记:上海摩拜共享单车

2017年8月上海地区摩拜单车的数据&#xff0c;已脱敏处理 订单id、自行车id、用户id、起始时间、起始经纬度、终止时间、终止经纬度、路径 数据地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1LqL_VtCfgm3vv-NrVCoTkw 提取码&#xff1a;3d3y

各种不同情景的现场急救方法,正确急救的动作要领与操作步骤

一、教程描述 生活中的现场急救&#xff0c;应该是每个人必备的生活技能&#xff0c;可以成功挽救很多人的生命。本套教程为你讲解在各种不同情景下&#xff0c;针对宝宝、儿童与成人等不同群体&#xff0c;现场急救的操作步骤&#xff0c;正确急救的动作要领&#xff0c;以及…

docker安装MySQL 5.7

1.安装 Mysql 5.7 docker镜像 拉取官方镜像 docker pull mysql:5.7查看镜像库 docker images2.创建mysql容器 在本地创建mysql的映射目录 mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf在/root/mysql/conf中创建 *.cnf 文件(叫什么都行) touch my.cnf创建…

【51单片机】10-蜂鸣器

1.蜂鸣器的原理 这里的“源”不是指电源。而是指震荡源。 也就是说&#xff0c;有源蜂鸣器内部带震荡源&#xff0c;所以只要一通电就会叫。 而无源内部不带震荡源&#xff0c;所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。 有源蜂鸣器往往比无源的贵&#xff…

mysql双主互从

在主从配置的基础上&#xff0c;反向配置