2023/09/21 day5 qt

2023-09-21 21:49:03

将注册的账号密码存储到数据库中

登录的账号密码与数据库中的账号密码进行匹配

头文件

#ifndef DENGLU_H
#define DENGLU_H
#include <QMainWindow>
#include <QDebug>
#include <QIcon>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include "second.h"
#include <QMessageBox>  //消息对话框类
#include "third.h"
#include <QSqlDatabase>   //数据库管理类
#include <QSqlQuery>      //执行sql语句的类
#include <QSqlRecord>     //数据库记录的类

QT_BEGIN_NAMESPACE
namespace Ui { class denglu; }
QT_END_NAMESPACE

class denglu : public QMainWindow
{
    Q_OBJECT

public:
    denglu(QWidget *parent = nullptr);
    ~denglu();
signals:
    void jump();    //自定义跳转信号函数
    void jump1();
private slots:
   void b1_clicked();
   void b2_clicked();
   void b3_clicked();

private:
    Ui::denglu *ui;
    QLabel *lab1;
    QLabel *lab2;
    QLabel *lab3;
    QLineEdit *edit1;
    QLineEdit *edit2;
    QPushButton *b1;
    QPushButton *b2;
    QPushButton *b3;
    Second *s1;
    third *s2;

    QSqlDatabase db;
};
#endif // DENGLU_H
#ifndef THIRD_H
#define THIRD_H

#include <QWidget>
#include <QMessageBox>
#include <QDebug>
#include <QIcon>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QSqlDatabase>   //数据库管理类
#include <QSqlQuery>      //执行sql语句的类
#include <QSqlRecord>     //数据库记录的类
namespace Ui {
class third;
}

class third : public QWidget
{
    Q_OBJECT

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

public slots:
    void jump_slot1();
private slots:
    void on_btn1_clicked();

private:
    Ui::third *ui;

    //声明一个数据库的类对象
    QSqlDatabase db;
};

#endif // THIRD_H

源文件

#include "denglu.h"
#include "ui_denglu.h"
denglu::denglu(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::denglu)
{
    ui->setupUi(this);
    this->setFixedSize(430,360); //设置固定主界面尺寸
    this->setWindowTitle("Widget"); //设置窗口标题
    this->setWindowIcon(QIcon(":/Image/icon/wodepeizhenshi.png"));
    //实例化一个标签
    lab1 = new QLabel(this);
    lab1->resize(430,180); //设置占窗体一半尺寸
    lab1->setPixmap(QPixmap(":/Image/icon/jinx.bmp"));
    lab1->setScaledContents(1);
    //实例化第二个标签
    lab2 = new QLabel(this);
    lab2->resize(45,30);  //设置尺寸
    lab2->move(this->x()+65,this->y()+200); //移动位置
    lab2->setPixmap(QPixmap(":/Image/icon/userName.jpg"));//填充图片
    lab2->setScaledContents(1);
    //实例化第三个标签
    lab3 = new QLabel(this);
    lab3->resize(45,30);  //设置尺寸
    lab3->move(lab2->x(),lab2->y()+60); //移动位置
    lab3->setPixmap(QPixmap(":/Image/icon/passwd.jpg"));//填充图片
    lab3->setScaledContents(1);
    //实例化行编辑器1
    edit1 = new QLineEdit(this);
    edit1->resize(200,32); //设置尺寸
    edit1->move(lab2->x()+55,lab2->y()); //移动位置
    edit1->setPlaceholderText("admin"); //设置默认值,占位文本
    edit1->setMaxLength(20); //设置最大文本容量
    //实例化行编辑器2
    edit2 = new QLineEdit(this);
    edit2->resize(200,32); //设置尺寸
    edit2->move(lab3->x()+55,lab3->y()); //移动位置
    edit2->setEchoMode(QLineEdit::Password); //设置回显模式
    edit2->setMaxLength(20); //设置最大文本容量
    //实例化按钮1
    b1 = new QPushButton(QIcon(":/Image/icon/login.png"),"登录",this);
    b1->resize(80,32); //设置尺寸
    b1->move(this->x()+100,lab3->y()+50); //移动位置

    //实例化按钮2
    b2 = new QPushButton(QIcon(":/Image/icon/cancel.png"),"取消",this);
    b2->resize(80,32); //设置尺寸
    b2->move(this->x()+230,b1->y()); //移动位置


    //实例化按钮3
    b3 = new QPushButton(this);
    b3->resize(80,32); //设置尺寸
    b3->setText("注册");
    b3->move(edit1->x()+220,edit1->y()+40); //移动位置




    //将当前界面的信号,与登录消息对话框函数连接
    connect(b1,&QPushButton::clicked,this,&denglu::b1_clicked);
    //将当前界面的信号,与取消消息对话框函数连接
    connect(b2,&QPushButton::clicked,this,&denglu::b2_clicked);
    //将当前界面的信号,与取消消息对话框函数连接
    connect(b3,&QPushButton::clicked,this,&denglu::b3_clicked);


    //将当前界面的信号,与s1界面的槽函数进行连接
    s1 = new Second;
    connect(this,&denglu::jump,s1,&Second::jump_slot);

    s2 = new third;
    connect(this,&denglu::jump1,s2,&third::jump_slot1);
}

denglu::~denglu()
{
    delete ui;
}


//登录按钮,如果账号密码和数据库中存储的账号密码一直就登录成功,否则登陆失败
void denglu::b1_clicked()
{

    //判断自己的数据库对象中是否包含了要处理的数据库,如果没有包含则添加一个数据库,
    //如果包含了,就可以打开了
    if(!db.contains("mydb1.db"))
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        //设置数据库名字
        db.setDatabaseName("mydb1.db");
    }
    //此时已经有了一个名为mydatabase的数据
    //打开数据库
    if(!db.open())
    {
        QMessageBox::information(this,"失败","打开数据库失败");
        return ;
    }

    //查找名为user_info的数据表的内容
    QString username = this->edit1->text();
    QString sql = QString("select * from user_info where user_id = '%1'").arg(username);
    //语句执行者
    QSqlQuery q;
    if(!q.exec(sql))
    {
        QMessageBox::information(this,"提示","显示失败");
        return ;
    }

    QString dbpassword;

    while(q.next())
    {

         dbpassword = q.value("password").toString();

    }
    if(this->edit1->text() == "" ||this->edit2->text()== "")
    {
        QMessageBox::information(this,"提示","用户名或密码不能为空");
        return ;
    }
    else if(this->edit2->text()==dbpassword)
    {
        //直接调用静态成员函数完成对话框的实现
        int ret = QMessageBox::information(this,
                                    "信息",
                                    "登录成功",
                                    QMessageBox::Ok);
        if(ret ==QMessageBox::Ok)
        {
            //关闭登录界面
            this->hide();
            //跳转到其他页面
            emit jump();
        }

    }
    else
    {
        QMessageBox box(QMessageBox::Critical,
                    "出错",
                    "账号密码不匹配,是否重新登录",
                    QMessageBox::Ok|QMessageBox::Cancel,
                    this);   //父组件
        box.setDefaultButton(QMessageBox::Ok); //设置默认

        //调用exec函数允许对话框
        int ret = box.exec();
        //对结果进行判断

            if(ret == QMessageBox::Ok)
            {
                this->edit2->clear();
            }
            else if(ret == QMessageBox::Cancel)
            {
                this->hide();
            }
    }

}

void denglu::b2_clicked()
{
    int ret = QMessageBox::information(this,
                                       "退出",
                                       "是否确定要退出登录",
                                       QMessageBox::Yes|QMessageBox::No);
    if(ret == QMessageBox::Yes)
    {
        this->close();
    }
    else if(ret == QMessageBox::No)
    {
            //不做操作
    }
}

void denglu::b3_clicked()
{
    emit jump1();
}


注册界面

#include "third.h"
#include "ui_third.h"

third::third(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::third)
{
    ui->setupUi(this);
    //判断自己的数据库对象中是否包含了要处理的数据库,如果没有包含则添加一个数据库,
    //如果包含了,就可以打开了
    if(!db.contains("mydb1.db"))
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        //设置数据库名字
        db.setDatabaseName("mydb1.db");
    }
    //此时已经有了一个名为mydatabase的数据
    //打开数据库
    if(!db.open())
    {
        QMessageBox::information(this,"失败","打开数据库失败");
        return ;
    }

    //数据库已经打开,需要创建一个数据表
    //准备sql语句
    QString sql = "create table if not exists user_info(user_id varchar(20) primary key,password varchar(20))";

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

    //调用QSqlQuery类下的成员函数exec执行sql语句
    if(!q.exec(sql))
    {
        QMessageBox::information(this,"失败","创建数据表失败");
        return ;
    }

}

third::~third()
{
    delete ui;
}
void third::jump_slot1()
{
    this->show();
}

//注册按钮对应的槽函数
void third::on_btn1_clicked()
{
        //获取ui界面中要录入的数据
        //账号
        QString user_id = ui->ledit1->text();
        //密码
        QString password = ui->ledit2->text();

        //判断要确保每个编辑器下都有数据
        if(user_id.isEmpty() || password.isEmpty())
        {
            QMessageBox::information(this,"提示","请将信息填写完整");
            return ;
        }

        //准备sql语句向表中添加数据
        QString sql = QString("insert into user_info(user_id,password)"
                              "values('%1','%2')").arg(user_id).arg(password);

        qDebug()<<sql;

        //准备语句执行者
        QSqlQuery querry;
        if(!querry.exec(sql))
        {
            QMessageBox::information(this,"失败","添加失败");

            return ;
        }
        else
        {
            QMessageBox::information(this,"成功","添加成功");
        }
}

更多推荐

C2基础设施威胁情报对抗策略

威胁情报是指在信息安全和安全防御领域,收集、分析和解释与潜在威胁相关的信息,以便预先发现并评估可能对组织资产造成损害的潜在威胁,是一种多维度、综合性的方法,其通过信息的收集、分析和研判,帮助组织了解可能对其安全构成威胁的因素。这种方法不仅仅着重于技术层面,还包括了社会、心理、政治等多个维度,以此更好地应对不断变化和复杂

用js理解常用设计模式

目录原则创建型单例模式工厂模式js闭包:函数工厂结构型代理模式装饰器模式行为型职责链模式观察者模式原则S–SingleResponsibilityPrinciple单一职责原则一个程序只做好一件事如果功能过于复杂就拆分开,每个部分保持独立例如:Promise每个then中的逻辑只做好一件事O–OpenClosedPri

旧版office如何卸载干净,Mac电脑移除office教程

版office卸载不干净导致无法激活新版Microsoftoffice,这个问题如何解决呢?深受这一烦恼的小伙伴看过来!旧版office由于证书一直清理不干净,电脑上有旧证书存在导致新版offce激活不成功,具体手动清理方法带给大家。Microsoftoffice365安装方法一:关闭所有Office应用程序。打开“应

无线定位中TDOA时延估计算法matlab仿真

目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览2.算法运行软件版本matlab2022a3.部分核心程序...................................................................figu

详解window.print(),实现长列表打印分页

相信大家平时做项目时,打印需求很常见,但想把打印做好,还是要花点时间的。特别是长列表要分页的情况。我们知道浏览原生API`window.print()`可以用于印当前窗口(window.document)视图内容。调用此方法会产生一个打印预览弹框,用户可以根据具体设置来得到打印结果。一、window的打印事件默认情况下

抄写Linux源码(Day12:从 MBR 到 C main 函数 (1) )

回忆我们需要做的事情:为了支持shell程序的执行,我们需要提供:1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)2.硬盘驱动、文件系统(shell程序一开始是存放在磁盘里的,所以需要这两个东西)3.fork,execve,wait这三个系统调用,也可以说是进程调度(否则无法haltshell程序并且启

C++ 字符串

C++字符串C++提供了以下两种类型的字符串表示形式:C风格字符串C++引入的string类类型C风格字符串C风格的字符串起源于C语言,并在C++中继续得到支持。字符串实际上是使用null字符\0终止的一维字符数组。因此,一个以null结尾的字符串,包含了组成字符串的字符。下面的声明和初始化创建了一个RUNOOB字符串

【Linux】系统编程生产者消费者模型(C++)

目录【1】生产消费模型【1.1】为何要使用生产者消费者模型【1.2】生产者消费者模型优点【2】基于阻塞队列的生产消费者模型【2.1】生产消费模型打印模型【2.2】生产消费模型计算公式模型【2.3】生产消费模型计算公式加保存任务模型【2.3】生产消费模型多生产多消费【1】生产消费模型生产消费模型的321原则(便于记忆)。

WebGL中JS与GLSL ES 语言通信,着色器间的数据传输示例:js控制绘制点位

js改变点位,动态传值<canvasid="canvas"></canvas><!--顶点着色器--><scriptid="vertexShader"type="x-shader/x-vertex">attributevec4a_Position;voidmain(){//点位gl_Position=a_Positio

<Babel> 前端语言的巴别塔

Babel中文站点:https://www.babeljs.cn/Babel外文站点:https://babeljs.io/什么是BabelBabel取自人类语言最早的传说,TowerofBabel。上帝摧毁了巴别塔上说着共同语言的我们,又被Babel重新带了回来。如果说巴别塔是人们对混乱到秩序的向往,那Babel在前

详细介绍Webpack5中的Loader

loader用于帮助webpack将不同类型的文件转换为webpack可识别的模块。优先级分类pre:前置loadernormal:普通loader,没有用enforce指定就是normalinline:内联loaderpost:后置loaderloader执行顺序pre>normal>inline>post相同优先级

热文推荐