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.mzph.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;也不指向函数的词法作…