Qt—用SQLite实现简单的注册登录界面

1.实现目标

本次实现通过SQLite制作一个简易的登录窗口,当点击注册按钮时,登录窗口会消失,会出现一个新的注册界面;完成注册或退出注册时,注册窗口会消失,重新出现登录窗口。注册过的用户信息会出现在SQLite的表中。

想要完成本次目标,我们需要完成以下步骤:

  1. 需要两个界面,登录界面:MainWindow(QMainWindow);注册界面:SIghUp(QWidget)
  2. 启动程序时,SQLite进行初始化、并创建表数据
  3. 点击注册按钮,登录窗口消失,从重新出现一个新的注册窗口
  4. 在注册界面中点击注册按钮时,初始化SQLite,并把当前界面的账户和密码插入到数据库表中,注册成功后注册界面消失,登陆界面出现;在注册界面中点击退出按钮,注册成功后注册界面消失,登陆界面出现
  5. 在登录界面上输入注册过的账户和密码,点击登录时,检查数据库表中的信息,如果正确则登录成功。

2.具体实现

Mainwindow(登录界面)

首先展示头文件所需的槽函数和成员变量

接下来是登录界面,登录界面的ui如下,只需要记住其中的几个控件即可

ui界面创建完毕后,我们需要设置显示密码初始化SQLite

显示密码的槽函数

cpp 复制代码
void MainWindow::on_checkBox_toggled(bool checked)
{
    if(checked)
        ui->passwd->setEchoMode(QLineEdit::Normal);
    else
        ui->passwd->setEchoMode(QLineEdit::Password);
}

初始化数据库

cpp 复制代码
void MainWindow::initSqlite()
{
    sqlite=QSqlDatabase::addDatabase("QSQLITE");

    //设置数据库名称
    sqlite.setDatabaseName("User.db");

    //检查数据库是否能打开
    if(!sqlite.open())
    {
        QMessageBox::critical(this,"数据库打开失败",sqlite.lastError().text());
        return;
    }
    qDebug()<<"SQLite连接成功,并创建 [User.db] 数据库!!!";

    //创建数据库
    QString sql=("CREATE TABLE  IF NOT EXISTS User(\
                 id integer primary key autoincrement,\
                 username ntext unique not NULL,\
                 password ntext not NULL)");
    QSqlQuery query;
    if(!query.exec(sql))
    {
        QMessageBox::critical(this,"数据库创建失败",sqlite.lastError().text());
        return;
    }
    qDebug()<<"SQLite连接成功,并创建 [User.db] 数据库!!!";


}

初始化完毕,点击登录按钮,获取其LineEdit上的字符串与数据库进行查找,查找成功跳转界面,失败则报错

登录按钮的槽函数

cpp 复制代码
void MainWindow::on_logIn_clicked()
{

    //获取界面上的用户和密码
    QString account=ui->account->text();
    QString passwd=ui->passwd->text();

    QString sql=QString("SELECT * FROM User where username='%1'and password='%2'").arg(account)
            .arg(passwd);

    QSqlQuery query(sql);
    if(!query.next())
    {
        QMessageBox::critical(this,"登录失败","请重新检查账户和密码");
    }
    else
    {
        qDebug()<<"登录成功";
        QMessageBox::information(this,"登录认证","登录成功!");
        QWidget *w = new QWidget;
        w->show();
        this->close();
    }

}

点击注册按钮,关闭当前界面,创建新的注册界面并显示

注册按钮的槽函数

cpp 复制代码
void MainWindow::on_signUp_clicked()
{
    //关闭当前界面
    this->close();

    SignUp * signup=new SignUp;
    signup->show();

}

SignUp(注册界面)

先展示头文件,只用到了两个槽函数

接下来是ui界面

点击注册按钮时,初始化数据库并把界面上的账户和密码插入进数据库中;注册成功后该界面关闭,重新显示登录界面

注册按钮的槽函数

cpp 复制代码
void SignUp::on_signUp_clicked()
{
    MainWindow *w=new MainWindow;
    w->initSqlite();

    //获取lineEdit上的账户和密码
    QString account=ui->signUpAc->text();
    QString passwd=ui->signUpPs->text();

    QString sql=QString("insert into user(username,password) values('%1','%2');")
                    .arg(account).arg(passwd);

    QSqlQuery query;
            //判断执行结果
    if(!query.exec(sql))
    {
         qDebug()<<"insert into error";
         QMessageBox::information(this,"注册认证","注册失败!");
    }
    else
    {
         qDebug()<<"insert into success";
         QMessageBox::information(this,"注册认证","注册成功!");
         MainWindow *w = new MainWindow;
         w->show();
         this->close();
     }

}

点击退出按钮,没有注册,关闭当前界面并重新显示登录界面

退出按钮的槽函数

cpp 复制代码
void SignUp::on_quit_clicked()
{
    //关闭当前窗口
    this->close();

    MainWindow *w=new MainWindow;
    w->show();
}

3.整体代码展示

MainWindow.

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void initSqlite();

private slots:
    void on_checkBox_toggled(bool checked);

    void on_signUp_clicked();

    void on_logIn_clicked();

private:
    Ui::MainWindow *ui;
    QSqlDatabase sqlite;


};
#endif // MAINWINDOW_H

MainWindow.cpp

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "signup.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    ui->passwd->setEchoMode(QLineEdit::Password);

    initSqlite();//初始化SQLite
}

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

void MainWindow::initSqlite()
{
    sqlite=QSqlDatabase::addDatabase("QSQLITE");

    //设置数据库名称
    sqlite.setDatabaseName("User.db");

    //检查数据库是否能打开
    if(!sqlite.open())
    {
        QMessageBox::critical(this,"数据库打开失败",sqlite.lastError().text());
        return;
    }
    qDebug()<<"SQLite连接成功,并创建 [User.db] 数据库!!!";

    //创建数据库
    QString sql=("CREATE TABLE  IF NOT EXISTS User(\
                 id integer primary key autoincrement,\
                 username ntext unique not NULL,\
                 password ntext not NULL)");
    QSqlQuery query;
    if(!query.exec(sql))
    {
        QMessageBox::critical(this,"数据库创建失败",sqlite.lastError().text());
        return;
    }
    qDebug()<<"SQLite连接成功,并创建 [User.db] 数据库!!!";


}


void MainWindow::on_checkBox_toggled(bool checked)
{
    if(checked)
        ui->passwd->setEchoMode(QLineEdit::Normal);
    else
        ui->passwd->setEchoMode(QLineEdit::Password);
}

void MainWindow::on_signUp_clicked()
{
    //关闭当前界面
    this->close();

    SignUp * signup=new SignUp;
    signup->show();

}

void MainWindow::on_logIn_clicked()
{

    //获取界面上的用户和密码
    QString account=ui->account->text();
    QString passwd=ui->passwd->text();

    QString sql=QString("SELECT * FROM User where username='%1'and password='%2'").arg(account)
            .arg(passwd);

    QSqlQuery query(sql);
    if(!query.next())
    {
        QMessageBox::critical(this,"登录失败","请重新检查账户和密码");
    }
    else
    {
        qDebug()<<"登录成功";
        QMessageBox::information(this,"登录认证","登录成功!");
        QWidget *w = new QWidget;
        w->show();
        this->close();
    }

}

SignUp.h

cpp 复制代码
#ifndef SIGNUP_H
#define SIGNUP_H

#include <QWidget>

namespace Ui {
class SignUp;
}

class SignUp : public QWidget
{
    Q_OBJECT

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

private slots:

    void on_quit_clicked();

    void on_signUp_clicked();

private:
    Ui::SignUp *ui;
};

#endif // SIGNUP_H

SignUp.cpp

cpp 复制代码
#include "signup.h"
#include "ui_signup.h"
#include "mainwindow.h"

SignUp::SignUp(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SignUp)
{
    ui->setupUi(this);
}

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



void SignUp::on_quit_clicked()
{
    //关闭当前窗口
    this->close();

    MainWindow *w=new MainWindow;
    w->show();
}

void SignUp::on_signUp_clicked()
{
    MainWindow *w=new MainWindow;
    w->initSqlite();

    //获取lineEdit上的账户和密码
    QString account=ui->signUpAc->text();
    QString passwd=ui->signUpPs->text();

    QString sql=QString("insert into user(username,password) values('%1','%2');")
                    .arg(account).arg(passwd);

    QSqlQuery query;
            //判断执行结果
    if(!query.exec(sql))
    {
         qDebug()<<"insert into error";
         QMessageBox::information(this,"注册认证","注册失败!");
    }
    else
    {
         qDebug()<<"insert into success";
         QMessageBox::information(this,"注册认证","注册成功!");
         MainWindow *w = new MainWindow;
         w->show();
         this->close();
     }

}

4.总结

本次通过SQLite数据库制作了一个简单的登录注册窗口,因为比较简单所以没有用QSS进行美化,数据库的设计也比较简单。感兴趣的话大家可以在此基础上进行添加和改进。

相关推荐
r i c k1 分钟前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦15 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·1 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德1 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露2 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot