当前位置: 首页 > article >正文

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

 

相关文章:

Qt—用SQLite实现简单的注册登录界面

1.实现目标 本次实现通过SQLite制作一个简易的登录窗口&#xff0c;当点击注册按钮时&#xff0c;登录窗口会消失&#xff0c;会出现一个新的注册界面&#xff1b;完成注册或退出注册时&#xff0c;注册窗口会消失&#xff0c;重新出现登录窗口。注册过的用户信息会出现在SQLi…...

Nginx模块配置与请求处理详解

Nginx 作为模块化设计的 Web 服务器,其核心功能通过不同模块协同完成。以下是各模块的详细配置案例及数据流转解析: 一、核心模块配置案例 1. Handler 模块(内容生成) 功能:直接生成响应内容(如静态文件、重定向等) # 示例1:静态文件处理(ngx_http_static_module)…...

MySQL查询不区分大小写问题剖析

概述 在MySQL中&#xff0c;查询不区分大小写的问题通常与字符集的校对规则&#xff08;Collation&#xff09;有关。以下是详细解释和解决方案资料已经分类整理好&#xff1a;https://pan.quark.cn/s/f52968c518d3 一、原因分析 1. 默认校对规则 MySQL的默认校对规则&#…...

MySQL命令行导出数据(docker版本)

MySQL命令行导出数据(docker版本) 1、登录数据库 $mysql -h 10.1.1.143 -u root -p 2、用命令行从MySQL导出数据(无标题) #查看导出时可以存储的路径 mysql> SHOW VARIABLES LIKE secure_file_priv; ----------------------------------------- | Variable_name | Valu…...

分布式锁: Redisson红锁(RedLock)原理与实现细节

分布式锁是分布式系统的核心基础设施&#xff0c;但 单节点 Redis 锁在高可用场景下存在致命缺陷&#xff1a;当 Redis 主节点宕机时&#xff0c;从节点可能因异步复制未完成而丢失锁信息&#xff0c;导致多个客户端同时持有锁。为此&#xff0c;Redis 作者 Antirez 提出了 Red…...

Python 3.13.3 安装教程

原文来自&#xff1a;Python 3.13.3 安装教程 | w3cschool笔记 &#xff08;请勿标记为付费&#xff01;&#xff01;&#xff01;&#xff09; Python 是一种广泛使用的编程语言&#xff0c;广泛应用于 Web 开发、科学计算、数据处理、人工智能等领域。Python 3.13.3 作为 P…...

现代化水库运行管理矩阵平台如何建设?

政策背景 2023年8月24日&#xff0c;水利部发布的水利部关于加快构建现代化水库运行管理矩阵的指导意见中指出&#xff0c;在全面推进水库工程标准化管理的基础上&#xff0c;强化数字赋能&#xff0c;加快构建以推进全覆盖、全要素、全天候、全周期“四全”管理&#xff0c;完…...

2025程序设计天梯赛补题报告

2025程序设计天梯赛补题报告 仅包含L1 L2 L1-6 这不是字符串题 题目描述 因为每年天梯赛字符串题的解答率都不尽如人意&#xff0c;因此出题组从几年前开始决定&#xff1a;每年的天梯赛的 15 分一定会有一道字符串题&#xff0c;另外一道则一定不是字符串题。 小特现在有…...

SpringBoot3.4.5下Lombok的@Data注解不生效,解决方案

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 1.问题 最近的项目是Python、Java、鸿蒙的来回交叉&#xff0c;再做的一个Java的项目…...

iOS设备投屏Archlinux

我的iphone手机屏太小&#xff0c;我想把手机投到archlinux电脑上看。与是我就想找一个免费的软件。 UxPlay https://github.com/FDH2/UxPlay GPLv3&#xff0c;开源。原来只支持 AirPlay Mirror 协议&#xff0c;现在新增 支持来自 AirPlay 的纯音频 &#xff08;Apple Los…...

如何在 Windows 上安装类似 Synaptic 的 Chocolatey GUI 包管理器

如果你正在寻找类似 Linux 中 APT 的 Windows 包管理器&#xff0c;那么没有什么比 Chocolatey 更好的了。它是 Windows 10 上可用的最佳包管理器之一&#xff0c;可以通过命令行界面安装所有流行的软件和工具。然而&#xff0c;这并不意味着如果你不喜欢命令行&#xff0c;你就…...

Guided Filtering相关记录

一、背景介绍 以前折腾保边滤波时候&#xff0c;刷了一些Guided Filtering相关资料。这里主要是对它们做个算法效果复现和资料简单整理。 二、Guided Filtering 1、基本原理 原版Guided Filtering的提出&#xff0c;主要是为了改善双边滤波做保边平滑滤波器时候的梯度翻转伪影…...

智能AI构建工地安全网:跌倒、抽搐、区域入侵多场景覆盖

智能AI在工地安全中的应用&#xff1a;从监测到救援的全流程实践 一、背景&#xff1a;高温作业下的工地安全挑战 随着夏季高温持续&#xff0c;工地户外作业环境面临严峻考验。工人因高温疲劳、脱水或突发疾病引发的行为异常&#xff08;如晕厥、抽搐、跌倒&#xff09;频发…...

MySQL 8.0 OCP 1Z0-908 121-130题

Q121.Examine these statements and output: mysql> GRANT PROXY ON accountinglocalhost TO ’ ‘ ‘%’; mysql> SELECT USER(), CURRENT_USER(), proxy_user; --------------------------------------------------------- |USER() | CURRENT_USER() | proxy_user I | …...

Spring+LangChain4j小智医疗项目

这里写目录标题 LangChain4j入门配置测试Ollama阿里云百炼平台AIService聊天记忆隔离聊天 MongoDB持久化存储Prompt*创建小智医疗助手Function Calling&#xff08;Tools&#xff09;实战小智医疗智能体 RAGToken分词器向量存储流式输出总结 LangChain4j入门 LangChain4j 是一…...

解决“VMware另一个程序已锁定文件的一部分,进程无法访问“

问题描述 打开VMware里的虚拟机时&#xff0c;弹出"另一个程序已锁定文件的一部分&#xff0c;进程无法访问"如图所示&#xff1a; 这是VM虚拟机的保护机制。虚拟机运行时&#xff0c;为防止数据被篡改&#xff0c;会将所运行的文件保护起来。当虚拟机崩溃或者强制…...

buuctf Crypto-鸡藕椒盐味1

1.题目&#xff1a; 公司食堂最新出了一种小吃&#xff0c;叫鸡藕椒盐味汉堡&#xff0c;售价八块钱&#xff0c;为了促销&#xff0c;上面有一个验证码&#xff0c;输入后可以再换取一个汉堡。但是问题是每个验证码几乎都有错误,而且打印的时候倒了一下。小明买到了一个汉堡&a…...

FreeRTOS的学习记录(基础知识)

FreeRTOS 简介 FreeRTOS 是一个开源的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;专为嵌入式系统设计。它提供了任务管理、时间管理、信号量、消息队列、内存管理等功能&#xff0c;适用于资源受限的微控制器。 FreeRTOS 是一个开源的实时操作系统内核&#xff0c…...

会议分享|高超声速流动测量技术研讨会精彩探析

由中国空气动力学会测控专业委员会主办&#xff0c;中国科学技术大学工程科学学院承办的第八届三次委员会暨高超声速流动测量技术研讨会&#xff0c;5月16日在合肥盛大开幕。 会议专家报告分享了高超声速流动测量的最新研究成果、挑战与突破&#xff0c;展示了PIV高速摄像机、粒…...

1-10 目录树

在ZIP归档文件中&#xff0c;保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时&#xff0c;可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。 输入格式: 输入首先给出正整数N&#xff08;≤104&#xff09;…...

redis开源协议的变更和使用影响

2013年:采用 BSD 协议 核心内容:Redis 最初采用 BSD 3-Clause 协议,允许用户自由使用、修改和分发代码,包括闭源商业用途。这种宽松的协议促进了 Redis 的快速普及,尤其是云计算厂商将其作为托管服务的基础。 影响:云服务商(如 AWS、阿里云等)可合法地将 Redis 集成到其…...

数据库的锁 - 全局锁、表锁、行锁

目录 一、全局锁 1.1 介绍 1.2 语法 1). 加全局锁 2). 数据备份 3). 释放锁 1.3 特点 二、表级锁 2.1 表锁 2.2 元数据锁&#xff08;MDL&#xff09; 2.3 意向锁 三、行级锁 3.1 行锁​ 3.2 间隙锁 & 临键锁​ 一、全局锁 1.1 介绍 全局锁是对整个数据库实…...

Unix/Linux | A Programming Guide

注&#xff1a;本文为 “UNIX / Linux 教程” 相关文章合辑。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 UNIX / Linux Tutorial for Beginners: Learn Online in 7 days By : Emily Carter UpdatedFebruary 5, 2025 UNIX / Linux Tutorial Summary Linux …...

前端——布局方式

普通流&#xff08;标准流&#xff09; 所谓的标准流: 就是标签按照规定好默认方式排列. 1. 块级元素会独占一行&#xff0c;从上向下顺序排列。 常用元素&#xff1a;div、hr、p、h1~h6、ul、ol、dl、form、table 2. 行内元素会按照顺序&#xff0c;从左到右顺序排列&am…...

Multimodal models —— CLIP,LLava,QWen

目录 CLIP CLIP训练 CLIP图像分类 CLIP框架 Text Enocder Image Encoder LLava系列 LLava LLava贡献 LLava模型结构 总结 LLava两阶段训练 LLava 1.5 LLava 1.6 QWen CLIP CLIP是OpenAI 在 2021 年发布的&#xff0c;最初用于匹配图像和文本的预训练神经网络模型…...

Python模块化编程进阶指南:从基础到工程化实践

一、模块化编程核心原理与最佳实践 1.1 模块化设计原则 根据企业级项目实践&#xff0c;模块化开发应遵循以下核心原则&#xff1a; ​​单一职责原则​​&#xff1a;每个模块只承担一个功能域的任务&#xff08;如用户认证模块独立于日志模块&#xff09;​​接口隔离原则…...

json-server的用法-基于 RESTful API 的本地 mock 服务

json-server 是一个非常方便的工具&#xff0c;用于快速搭建基于 RESTful API 的本地 mock 服务&#xff0c;特别适合前端开发阶段模拟后端数据接口。 &#x1f9e9; 一、安装 npm install -g json-server&#x1f680; 二、快速启动 创建一个 db.json 文件&#xff08;模拟数…...

LabVIEW与PLC通讯程序S7.Net.dll

下图中展示的是 LabVIEW 环境下通过调用S7.Net.dll 组件与西门子 PLC 进行通讯的程序。LabVIEW 作为一种图形化编程语言&#xff0c;结合S7.Net.dll 的.NET 组件优势&#xff0c;在工业自动化领域中可高效实现与 PLC 的数据交互&#xff0c;快速构建工业监控与控制应用。相较于…...

STM32 __main汇编分析

在STM32的启动流程中&#xff0c;__main是一个由编译器自动生成的C标准库函数&#xff0c;其汇编级调用逻辑可通过启动文件&#xff08;如startup_stm32fxxx.s&#xff09;观察到&#xff0c;但具体实现细节被封装在编译器的运行时库中。以下是其核心逻辑解析&#xff1a; 一、…...

使用GpuGeek高效完成LLaMA大模型微调:实践与心得分享

使用GpuGeek高效完成LLaMA大模型微调&#xff1a;实践与心得分享 &#x1f31f;嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 随着大模型的发展&#xff0…...