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进行美化,数据库的设计也比较简单。感兴趣的话大家可以在此基础上进行添加和改进。

相关推荐
广州灵眸科技有限公司6 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手9 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh11 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD12 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo12 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
Ai_easygo13 小时前
MCP 协议实战:用 Claude Desktop 连本地 SQLite,5 分钟搭一个能查数据的 AI 助手
jvm·人工智能·sqlite
TlSfoward13 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记13 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘