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

news2025/7/20 6:41:57

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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…

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的项目…

如何在 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;频发…

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;…

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;最初用于匹配图像和文本的预训练神经网络模型…

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

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

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

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

华为IP(6)

VLAN聚合 VLAN聚合产生的技术背景 在一般是三层交换机中&#xff0c;通常采用一个VLAN接口的方式实现广播域之间的互通&#xff0c;这在某些情况下导致了IP地址的浪费 因为一个VLAN对应的子网中&#xff0c;子网号、子网广播地址、子网网关地址不能用作VLAN内的主机IP地址&a…