Qt—用SQLite實現簡單的注冊登錄界面

1.實現目標

本次實現通過SQLite制作一個簡易的登錄窗口,當點擊注冊按鈕時,登錄窗口會消失,會出現一個新的注冊界面;完成注冊或退出注冊時,注冊窗口會消失,重新出現登錄窗口。注冊過的用戶信息會出現在SQLite的表中。

?想要完成本次目標,我們需要完成以下步驟:

  1. 需要兩個界面,登錄界面:MainWindow(QMainWindow);注冊界面:SIghUp(QWidget)
  2. 啟動程序時,SQLite進行初始化、并創建表數據
  3. 點擊注冊按鈕,登錄窗口消失,從重新出現一個新的注冊窗口
  4. 在注冊界面中點擊注冊按鈕時,初始化SQLite,并把當前界面的賬戶和密碼插入到數據庫表中,注冊成功后注冊界面消失,登陸界面出現;在注冊界面中點擊退出按鈕,注冊成功后注冊界面消失,登陸界面出現
  5. 在登錄界面上輸入注冊過的賬戶和密碼,點擊登錄時,檢查數據庫表中的信息,如果正確則登錄成功。

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進行美化,數據庫的設計也比較簡單。感興趣的話大家可以在此基礎上進行添加和改進。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81198.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81198.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day 18:零基礎學嵌入式之數據結構——

一、基礎內容 1.數據結構&#xff1a;相互之間存在一種或多種特定關系的數據元素的集合。 2.邏輯結構 &#xff08;1&#xff09;集合&#xff0c;所有數據在同一個集合中&#xff0c;關系平等。 &#xff08;2&#xff09;線性&#xff0c;數據和數據之間是一對一的關系 &am…

【SSL證書系列】客戶端如何驗證https網站服務器發的證書是否由受信任的根證書簽發機構簽發

客戶端驗證HTTPS網站證書是否由受信任的根證書頒發機構&#xff08;CA&#xff09;簽發&#xff0c;是一個多步驟的過程&#xff0c;涉及證書鏈驗證、信任錨&#xff08;Trust Anchor&#xff09;檢查、域名匹配和吊銷狀態驗證等。以下是詳細的驗證流程&#xff1a; 1. 證書鏈的…

iOS即時通信的技術要點

iOS即時通信開發的關鍵技術要點總結&#xff1a; 一、通訊協議選擇 Socket通信 基礎實現&#xff1a;使用原生BSD Socket或CFNetwork框架&#xff08;復雜&#xff09;&#xff0c;推薦第三方庫如CocoaAsyncSocket&#xff08;封裝GCDAsyncSocket&#xff09;&#xff0c;簡化T…

智能AI構建工地安全網:跌倒、抽搐、區域入侵多場景覆蓋

智能AI在工地安全中的應用&#xff1a;從監測到救援的全流程實踐 一、背景&#xff1a;高溫作業下的工地安全挑戰 隨著夏季高溫持續&#xff0c;工地戶外作業環境面臨嚴峻考驗。工人因高溫疲勞、脫水或突發疾病引發的行為異常&#xff08;如暈厥、抽搐、跌倒&#xff09;頻發…

Doris

Apache Doris&#xff08;原名&#xff1a;Palo&#xff09;是一個高性能、實時的MPP分析型數據庫&#xff0c;非常適合海量數據的即席查詢、報表分析、指標統計等 OLAP 場景。Doris 的設計目標是&#xff1a;極致查詢性能、簡單易用、支持高并發分析和明細查詢。 一、Doris 核…

# 2-STM32F103-復位和時鐘控制RCC

STM32-復位和時鐘控制RCC 2-STM32-復位和時鐘控制RCC摘要說明本文參考資料如下&#xff1a; 一、STM32最小系統回顧STM32F103C8T6核心板原理圖 二、復位三、時鐘3.1 時鐘樹3.2 STM32啟動過程3.2 SystemInit()函數3.2.1 SystemInit()第1句&#xff1a;3.2.2 SystemInit()第2句&a…

rk3576 gstreamer opencv

安裝gstreamer rk3588使用gstreamer推流_rk3588 gstreamer-CSDN博客 rk3588使用gstreamer推流_rk3588 gstreamer-CSDN博客 Installing on Linux sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-pl…

Quic如何實現udp可靠傳輸

QUIC&#xff08;Quick UDP Internet Connections&#xff09;是由 Google 設計并被 IETF 標準化的傳輸層協議&#xff0c;它基于 UDP 實現&#xff0c;但提供了類似 TCP 的可靠性和更高級的功能&#xff08;如多路復用、0-RTT 握手、TLS 加密等&#xff09;。 盡管 UDP 是不可…

uniapp-商城-59-后臺 新增商品(屬性的選中,進行過濾展示,filter,some,every和map)

前面講了屬性的添加&#xff0c;添加完成后&#xff0c;數據庫中已經存在數據了&#xff0c;這時再繼續商品的添加時&#xff0c;就可以進行屬性的選擇了。 在商品添加過程中&#xff0c;屬性選擇是一個關鍵步驟。首先&#xff0c;界面需要展示嵌套的屬性數據&#xff0c;用戶通…

負載均衡 ELB 在 zkmall開源商城高流量場景下的算法優化

在電商大促、直播帶貨等高頻交易場景下&#xff0c;流量突發增長對系統穩定性提出嚴峻挑戰。ZKmll 開源商城通過對負載均衡 ELB&#xff08;Elastic Load Balancer&#xff09;算法的深度優化&#xff0c;結合業務場景特性設計動態加權輪詢 地域感知 熱點分流的混合策略&…

Linux干貨(三)

前言 從B站黑馬程序員Linux課程摘選的學習干貨&#xff0c;新手友好&#xff01;若有侵權&#xff0c;會第一時間處理。 目錄 前言 1.which find命令 1.which命令 2.find命令 2.grep wc 管道符 1.grep命令 2.wc命令 3.管道符 3.echo tail 重定向符 1.echo命令 2.反…

Sigmoid與Softmax:從二分類到多分類的深度解析

Sigmoid與Softmax:從二分類到多分類的深度解析 聯系 函數性質:二者都是非線性函數 ,也都是指數歸一化函數,可將輸入值映射為0到1之間的實數 ,都能把輸出轉化成概率分布的形式,在神經網絡中常作為激活函數使用。Softmax是Sigmoid的推廣:從功能角度看,Softmax函數可視為…

文件系統交互實現

關于之前的搭建看QT控件文件系統的實現-CSDN博客&#xff0c;接下來是對本程序的功能完善&#xff0c;我想著是這樣設計的&#xff0c;打開一個目錄以后&#xff0c;鼠標選中一個項可以是目錄&#xff0c;也可以是文件&#xff0c;右鍵可以出現一個菜單選擇操作&#xff0c;比如…

[ctfshow web入門] web75

信息收集 啟用了open_basedir&#xff0c;所以之前的方法又不能用了 解題 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false …

Vulfocus靶場-文件上傳-3

WSO2 文件上傳 &#xff08;CVE-2022-29464&#xff09; WSO2是一家成立于 2005 年的開源技術提供商。它提供了一個企業平臺&#xff0c;用于在本地和整個 Internet 上 集成應用程序編程接口(API)、應用程序和 Web 服務。 某些 WSO2 產品允許無限制的文件上傳和遠程代碼執行。…

基于MCP的橋梁設計規范智能解析與校審系統構建實踐

引言 今天本文準備盤一個大活&#xff0c;聊一聊偏特定行業一點的AI技術深入應用思考及實踐。 一、傳統設計行業項目背景與行業痛點 在橋梁設計領域&#xff0c;標準規范是設計的基礎&#xff0c;直接關系到橋梁結構的安全性、耐久性和經濟性。然而&#xff0c;傳統的規范應…

遠程連接電腦的方法?異地遠程桌面連接和三方軟件實現

遠程連接電腦&#xff0c;是指通過網絡技術&#xff0c;在一臺設備上操控另一臺設備的電腦桌面&#xff0c;實現跨地域的操作和管理。在日常工作、技術支持、遠程辦公等場景中&#xff0c;遠程連接電腦都發揮著重要作用。實現遠程連接電腦主要有系統自帶工具和第三方軟件兩種方…

win11 安裝 wsl ubuntu 18.04后換源失敗!

記錄幾個問題是如何解決的。 一 下載wsl后&#xff0c;有報錯&#xff1a; Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e Error: 0x8007019e ??????? Linux ? Windows ???? Press any key to continue... …

PY32系列單片機離線燒錄器,可配置選項字節和上機臺批量燒錄

PY32離線燒錄器采用 MINI-USB 接口&#xff0c;提供穩定的物理連接。設備與電腦采用串口方式通訊&#xff0c;波特率固定為 1M。需配合我們的上位機使用。PY32離線燒錄器現支持芯片型號在PY32F002A/002B/002/003/030/071/072/040/403/303各封裝和XL32F001/003。燒錄器僅提供 3.…

深入理解 this 指向與作用域解析

引言 JavaScript 中的 this 關鍵字的靈活性既是強大特性也是常見困惑源。理解 this 的行為對于編寫可維護的代碼至關重要&#xff0c;但其動態特性也會讓我們感到困惑。 與大多數編程語言不同&#xff0c;JavaScript 的 this 不指向函數本身&#xff0c;也不指向函數的詞法作…