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);elseui->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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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);elseui->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_OBJECTpublic: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進行美化,數據庫的設計也比較簡單。感興趣的話大家可以在此基礎上進行添加和改進。
?