QT实现qq登录

news2025/2/27 21:05:22

1、登录界面

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QDebug>
#include "second.h"  //第二个界面头文件
#include "third.h"  //注册界面头文件

#include <QSqlDatabase>          //数据库管理类
#include <QSqlQuery>              //执行sql语句的类
#include <QSqlRecord>              //数据库记录的类
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    void jump();           //自定义跳转信号函数

    void jump2();           //自定义跳转信号函数

public:
    void jump_slot3();  //自定义跳转函数(注册页面)

private slots:

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;

    Second *s1;  //定义另一个界面的指针

    third *t1;  //定义注册页面的指针

    QSqlDatabase db;  //定义一个数据库的类
};
#endif // MAINWINDOW_H

源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->label->setPixmap(QPixmap("D:\\QTtupian\\jimoaqing.gif"));
    ui->label->setScaledContents(true);

    //账号图标
    ui->label_2->setPixmap(QPixmap("D:\\QTtupian\\zhanghao.jpg"));
    ui->label_2->setScaledContents(true);
    //密码图标
    ui->label_3->setPixmap(QPixmap("D:\\QTtupian\\mima.jpg"));
    ui->label_3->setScaledContents(true);

    s1 = new Second;  //给另一个界面实例化空间
    t1 = new third;   //给注册页面实例化空间

    //将当前界面的信号,与s1界面的槽函数进行连接
    connect(this,&MainWindow::jump, s1, &Second::jump_slot); //连接聊天室
    connect(this,&MainWindow::jump2, t1, &third::jump_slot2);  //连接注册
    connect(t1,&third::jump3, this, &MainWindow::jump_slot3);  //从注册跳回
    /********************************************************/

    //判断自己的数据库对象中,是否包含了要处理的数据库
    if(!db.contains("zhanghu.db"))
    {
        db = QSqlDatabase::addDatabase("QSQLITE");  //参数为驱动类型

        //设置数据库的名字
        db.setDatabaseName("zhanghu.db");
    }
    //此时已经有一个名为zhanghu.db的数据库

    //打开数据库
    if(!db.open())
    {
        QMessageBox::information(this,"失败","数据库打开失败");
        return ;
    }
    //zhanghu_info
}

MainWindow::~MainWindow()
{
    delete ui;
}

//注册按钮对应槽函数
void MainWindow::on_pushButton_3_clicked()
{
    emit jump2();  //发送跳转函数

    this->hide();  //将当前页面隐藏
}

//自定义跳转函数
void MainWindow::jump_slot3()
{
    this->show();
}

//登录按钮对应槽函数
void MainWindow::on_pushButton_clicked()
{
    //准备sql语句
    QString sql = "select * from zhanghu_info";

    //准备语句执行者
    QSqlQuery querry;

    //执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","显示失败");
        return ;
    }

    int i=0;  //记录行数
    QString Z;  //记录账号
    QString M;  //记录密码
    while(querry.next())
    {
        //遍历每条记录中的每一项内容
        for(int j=0;j<querry.record().count();j++)  //其中count为每一行数据的个数
        {

            if(ui->lineEdit->text()==querry.record().value(j).toString()&&
                    ui->lineEdit_2->text()==querry.record().value(j+1).toString())
            {
                Z = querry.record().value(j).toString();
                M = querry.record().value(j+1).toString();
            }
        }

        i++;
    }

    //判断输入的账号密码是否与数据库表中已注册的账号密码一致
    if(ui->lineEdit->text()==Z&&ui->lineEdit_2->text()==M)
    {
        //信息对话框
        QMessageBox box(QMessageBox::Question,"成功","登录成功",
                        QMessageBox::Ok,this);
        box.setDefaultButton(QMessageBox::Ok);  //默认到ok上

        int ret = box.exec();  //运行对话框
        if(ret == QMessageBox::Ok)
        {
            emit jump();  //发送跳转信息

            this->hide(); //将当前界面隐藏
        }
    }
    else
    {
        //错误对话框
        QMessageBox box(QMessageBox::Question,"错误","账号密码不匹配,是否重新登录",
                        QMessageBox::Ok|QMessageBox::Cancel,this);
        box.setDefaultButton(QMessageBox::Ok);  //默认到ok上
        int ret = box.exec();  //运行对话框
        switch(ret)
        {
        case QMessageBox::Ok:
            ui->lineEdit->clear();  //清楚账号密码内容
            ui->lineEdit_2->clear();
            break;
        case QMessageBox::Cancel:
            //ret=box.close();
            break;
        }
    }

}

//退出按钮对应槽函数
void MainWindow::on_pushButton_2_clicked()
{
    //问题对话框
    int ret = QMessageBox::question(this,"问题","是否确定要退出登录",
                                    QMessageBox::Yes|QMessageBox::No,
                                    QMessageBox::No);

    switch(ret)
    {
        case QMessageBox::Yes:
            this->close();  //关闭窗口
            break;
        case QMessageBox::No:
            break;
    }
}

主函数

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

2、注册窗口

头文件

#ifndef THIRD_H
#define THIRD_H

#include <QDialog>
#include <QMessageBox>
#include <QDebug>
#include <QSqlDatabase>          //数据库管理类
#include <QSqlQuery>              //执行sql语句的类
#include <QSqlRecord>              //数据库记录的类
#include <QMessageBox>



namespace Ui {
class third;
}

class third : public QDialog
{
    Q_OBJECT

public:
    explicit third(QWidget *parent = nullptr);
    ~third();

signals:
    void jump3();           //自定义跳转信号函数

public:
    void jump_slot2();         //接收跳转信号的槽函数

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::third *ui;

    QSqlDatabase db;

};

#endif // THIRD_H

源文件

#include "third.h"
#include "ui_third.h"

third::third(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::third)
{
    ui->setupUi(this);

    ui->label->setPixmap(QPixmap("D:\\QTtupian\\jimoaqing.gif"));
    ui->label->setScaledContents(true);
    //账号图标
    ui->label_2->setPixmap(QPixmap("D:\\QTtupian\\zhanghao.jpg"));
    ui->label_2->setScaledContents(true);
    //密码图标
    ui->label_3->setPixmap(QPixmap("D:\\QTtupian\\mima.jpg"));
    ui->label_3->setScaledContents(true);


    /**********************************************************/

    //判断自己的数据库对象中,是否包含了要处理的数据库
    if(!db.contains("zhanghu.db"))
    {
        db = QSqlDatabase::addDatabase("QSQLITE");  //参数为驱动类型

        //设置数据库的名字
        db.setDatabaseName("zhanghu.db");
    }

    //此时已经有一个名为zhanghu.db的数据库
    //打开数据库
    if(!db.open())
    {
        QMessageBox::information(this,"失败","数据库打开失败");
        return ;
    }

    //创建一个表
    //准备sql语句
    QString sql="create table if not exists zhanghu_info("
                "zhanghao varchar(30),mima varchar(30))";

    //准备语句执行者
    QSqlQuery querry;

    //执行者执行sql语句
    if(!querry.exec(sql))  //注意要把sql语句放进函数中
    {
        QMessageBox::information(this,"失败","创建表失败");
        return ;
    }

}

third::~third()
{
    delete ui;
}

//接收跳转信号对应的槽函数
void third::jump_slot2()
{
    this->show();            //将自己界面进行展示
}


//账户注册槽函数
void third::on_pushButton_clicked()
{

    //获取ui界面输入的账号和密码
    QString zhanghao = ui->lineEdit->text();
    QString mima = ui->lineEdit_2->text();

    //确保每个编辑器都有数据
    if(zhanghao.isEmpty()||mima.isEmpty())
    {
        QMessageBox::information(this,"提示","请将信息填写完整");
        return ;
    }

    //准备sql语句
    QString sql = "select * from zhanghu_info";

    //准备语句执行者
    QSqlQuery querry;

    //执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","显示失败");
        return ;
    }

    int i=0;  //记录行数
    QString Z;  //记录账号
    QString M;  //记录密码
    while(querry.next())
    {
        //遍历每条记录中的每一项内容
        for(int j=0;j<querry.record().count();j++)  //其中count为每一行数据的个数
        {

            if(ui->lineEdit->text()==querry.record().value(j).toString())
            {
                QMessageBox::information(this,"失败","该账号已被注册请重新输入");
                return ;
            }
        }

        i++;
    }

    //准备sql语句
    QString sql2 = QString("insert into zhanghu_info(zhanghao,mima)"
                          "values('%1',\"%2\")").arg(zhanghao).arg(mima);

    //准备语句执行者
    if(!querry.exec(sql2))
    {
        QMessageBox::information(this,"失败","注册失败");
        return ;
    }
    else
    {
        QMessageBox::information(this,"成功","注册成功");
    }

}


void third::on_pushButton_2_clicked()
{
    emit jump3();

    this->hide();
}

3、登录后界面

头文件

#ifndef SECOND_H
#define SECOND_H

#include <QDialog>

namespace Ui {
class Second;
}

class Second : public QDialog
{
    Q_OBJECT

public:
    explicit Second(QWidget *parent = nullptr);
    ~Second();

public slots:
    void jump_slot();         //接收跳转信号的槽函数

private:
    Ui::Second *ui;
};

#endif // SECOND_H

源文件

#include "second.h"
#include "ui_second.h"

Second::Second(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Second)
{
    ui->setupUi(this);
}

Second::~Second()
{
    delete ui;
}

//接收跳转信号对应的槽函数
void Second::jump_slot()
{
    this->show();            //将自己界面进行展示
}

4、思维导图

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

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

相关文章

如何进行性能测试

文章目录 前言什么是性能测试为什么要做性能测试怎么做我们的性能测试SoloPiSoloPi的介绍和安装SoloPi的性能数据 前言 随着科学技术的迅速发展&#xff0c;信息时代离不开软件&#xff0c;软件的成功上线离不开软件测试的功劳&#xff0c;因此软件测试对于软件的重要性不言而…

最新Java JDK 21:全面解析与新特性探讨

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

STP生成树协议基本配置示例---STP逻辑树产生和修改

STP是用来避免数据链路层出现逻辑环路的协议&#xff0c;运行STP协议的设备通过交互信息发现环路&#xff0c;并通过阻塞特定端口&#xff0c;最终将网络结构修剪成无环路的树形结构。在网络出现故障的时候&#xff0c;STP能快速发现链路故障&#xff0c;并尽快找出另外一条路径…

放大电路的理解

如有错误&#xff0c;敬请指正 【电子】模拟电子技术基础 上交大 郑益慧主讲&#xff08;模拟电路/模电 讲课水平堪比华成英&#xff0c;视频质量完爆清华版&#xff09;_哔哩哔哩_bilibili

Redis面试问题三什么是缓存雪崩怎么解决

定义 缓存雪崩是因为大量的key设置了同一过期时间的导致在同一时间类缓存同时过期&#xff0c;而这时因为请求过来已经没有缓存了&#xff0c;DB压力大数据库崩溃了。 解决方法 我可以在设置过期时间的时候加一个随机时间&#xff0c;在1-5分钟那样可以分散过期时间&#xf…

ClickHouse面向列的数据库管理系统(原理简略理解)

目录 官网 什么是Clickhouse 什么是OLAP 面向列的数据库与面向行的数据库 特点 为什么面向列的数据库在OLAP场景中工作得更好 为什么ClickHouse这么快 真实的处理分析查询 OLAP场景的关键属性 引擎作用 ClickHouse引擎 输入/输出 CPU 官网 https://clickhouse.com…

python实现命令tree的效果

把所有的文档都传到了git上,但是内容过多找起来不方便,突发奇想如果能在readme中,递归列出所有文件同时添加上对应的地址,这样只需要搜索到对应的文件点击就能跳转过去了… 列出文件总得有个显示格式,所以就按照tree的来了… 用python实现命令tree的效果 首先,这是tree的效果…

JS 手写call、apply和bind方法

手写call、apply和bind方法 一、方法介绍1.1 call 方法1.2 apply 方法1.3 bind 二、方法的实现2.1 call 方法2.2 apply 方法2.3 bind 方法 一、方法介绍 apply、call和bind都是系统提供给我们的内置方法&#xff0c;每个函数都可以使用这三种方法&#xff0c;是因为apply、call…

Unity中关于多线程的一些事

一.线程中不允许调用unity组件api 解决方法&#xff1a;可以使用bool值变化并且在update中监测bool值变化来调用关于unity组件的API. 二.打印并且将信息输出到list列表中 多线程可能同时输出多条信息。输出字符串可以放入Queue队列中。队列可以被多线程插入。 三.启用socke…

计算机基础协议/概念:推送数据— —WebSocket与SSE;前端Blob/URL下载文件

计算机基础协议/概念&#xff1a;推送数据— —WebSocket与SSE 1 WebSocket&#xff1a;双向通信 1.1 概念&#xff1a;通信过程 ①Upgrade&#xff1a;浏览器告知服务器升级为WebSocket协议 ②Switch&#xff1a;服务器升级成功后会返回101状态码 ③Communicate&#xff1…

SQL注入脚本编写

文章目录 布尔盲注脚本延时注入脚本 安装xampp&#xff0c;在conf目录下修改它的http配置文件&#xff0c;如下&#xff0c;找到配置文件&#xff1a; 修改配置文件中的默认主页&#xff0c;让xampp能访问phpstudy的www目录&#xff0c;因为xampp的响应速度比phpstudy快得多&am…

使用EasyExcel后端导出excel

官方文档&#xff1a;关于Easyexcel | Easy Excel 这里进行简单记录&#xff0c;方便确定是不是适用此方式&#xff1a; 零&#xff1a;实体类中注解用法 一&#xff1a;读excel /*** 强制读取第三个 这里不建议 index 和 name 同时用&#xff0c;要么一个对象只用index&…

代码随想录算法训练营第二天(C) | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

文章目录 前言一、977.有序数组的平方二、209.长度最小的子数组三、59.螺旋矩阵总结 前言 java版&#xff1a; 代码随想录算法训练营第二天 | 977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵_愚者__的博客-CSDN博客 一、977.有序数组的平方 …

Python环境配置及基础用法Pycharm库安装与背景设置及避免Venv文件夹

目录 一、Python环境部署及简单使用 1、Python下载安装 2、环境变量配置 3、检查是否安装成功 4、Python的两种模式&#xff08;编辑模式&交互模式&#xff09; 二、Pycharm库安装与背景设置 1、Python库安装 2、Pycharm自定义背景 三、如何避免Venv文件夹 一、P…

【Java 基础篇】Java TCP通信详解

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的网络传输协议&#xff0c;它提供了端到端的数据传输和可靠性保证。TCP通信适用于对数据传输的可靠性和完整性要求较高的场景&#xff0c;如文件传输、网页浏览等。本文将详细介绍Java中如何使…

搜索二叉树【C++】

文章目录 二叉搜索树二叉搜索树的模拟实现构造函数拷贝构造函数赋值运算符重载函数析构函数Insert循环递归 Erase循环递归 Find循环递归 二叉搜索树的应用K模型KV模型 完整代码普通版本递归版本 二叉搜索树 二叉搜索树又称为二叉排序树&#xff0c;它或者是一棵空树&#xff0…

Spring Security 的身份验证绕过漏洞CVE-2023-34035

文章目录 0.前言漏洞漏洞介绍描述 1.参考文档2.基础介绍2.1 组件简介&#xff1a;2.2 漏洞简介&#xff1a; 3.解决方案3.1. 升级版本 0.前言 背景&#xff1a;公司收到关于 Spring Security 的一个身份验证绕过漏洞的通知&#xff0c;该漏洞被标识为 CVE-2023-34035 漏洞 高 …

滴滴可观测平台 Metrics 指标实时计算如何实现了又准又省?

在滴滴&#xff0c;可观测平台的 Metrics 数据有一些实时计算的需求&#xff0c;承载这些实时计算需求的是一套又一套的 Flink 任务。之所以会有多套 Flink 任务&#xff0c;是因为每个服务按照其业务观测需要不同的指标计算&#xff0c;也就对应了不同数据处理拓扑。我们尽力抽…

ruoyi-vue-pro yudao 项目商城 mall 模块启用及相关SQL脚本

目前ruoyi-vue-pro 项目虽然开源&#xff0c;但是商城 mall 模块被屏蔽了&#xff0c;查看文档却要收费 199元&#xff08;知识星球&#xff09;&#xff0c;价格有点太高了吧。 分享下如何启用 mall 模块&#xff0c;顺便贴上sql相关脚本。 一、启用模块 修改根目录 pom.xm…

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序…