1.实现目标
本次实现通过SQLite制作一个简易的登录窗口,当点击注册按钮时,登录窗口会消失,会出现一个新的注册界面;完成注册或退出注册时,注册窗口会消失,重新出现登录窗口。注册过的用户信息会出现在SQLite的表中。
想要完成本次目标,我们需要完成以下步骤:
- 需要两个界面,登录界面:MainWindow(QMainWindow);注册界面:SIghUp(QWidget)
- 启动程序时,SQLite进行初始化、并创建表数据
- 点击注册按钮,登录窗口消失,从重新出现一个新的注册窗口
- 在注册界面中点击注册按钮时,初始化SQLite,并把当前界面的账户和密码插入到数据库表中,注册成功后注册界面消失,登陆界面出现;在注册界面中点击退出按钮,注册成功后注册界面消失,登陆界面出现
- 在登录界面上输入注册过的账户和密码,点击登录时,检查数据库表中的信息,如果正确则登录成功。
2.具体实现
Mainwindow(登录界面)
首先展示头文件所需的槽函数和成员变量
接下来是登录界面,登录界面的ui如下,只需要记住其中的几个控件即可
ui界面创建完毕后,我们需要设置显示密码和初始化SQLite
显示密码的槽函数
void MainWindow::on_checkBox_toggled(bool checked)
{
if(checked)
ui->passwd->setEchoMode(QLineEdit::Normal);
else
ui->passwd->setEchoMode(QLineEdit::Password);
}
初始化数据库
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上的字符串与数据库进行查找,查找成功跳转界面,失败则报错
登录按钮的槽函数
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();
}
}
点击注册按钮,关闭当前界面,创建新的注册界面并显示
注册按钮的槽函数
void MainWindow::on_signUp_clicked()
{
//关闭当前界面
this->close();
SignUp * signup=new SignUp;
signup->show();
}
SignUp(注册界面)
先展示头文件,只用到了两个槽函数
接下来是ui界面
点击注册按钮时,初始化数据库并把界面上的账户和密码插入进数据库中;注册成功后该界面关闭,重新显示登录界面
注册按钮的槽函数
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();
}
}
点击退出按钮,没有注册,关闭当前界面并重新显示登录界面
退出按钮的槽函数
void SignUp::on_quit_clicked()
{
//关闭当前窗口
this->close();
MainWindow *w=new MainWindow;
w->show();
}
3.整体代码展示
MainWindow.
#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
#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
#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
#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进行美化,数据库的设计也比较简单。感兴趣的话大家可以在此基础上进行添加和改进。