【QT】day5

2023-09-21 21:03:43

1.登录注册和数据库联动
三个头文件

#ifndef DEMO_H
#define DEMO_H

#include <QWidget>
#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery>    //执行sql语句的类
#include <QSqlRecord>   //数据库记录的类
#include <QMessageBox>  //消息对话框

namespace Ui {
class demo;
}

class demo : public QWidget
{
    Q_OBJECT

public slots:
    void jump_slots();

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

private:
    Ui::demo *ui;
};

#endif // DEMO_H

#ifndef DEMO_ZC_H
#define DEMO_ZC_H

#include <QWidget>

#include <QDebug>       //信息调试类,用于输出数据使用
#include<QIcon>         //图标头文件
#include <QPushButton>  //按钮头文件
#include<QLineEdit>     //行类头文件
#include<QLabel>        //标签头文件
#include <QCheckBox>    //多选框头文件
#include <QMessageBox>  //对话框头文件
#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery>    //执行sql语句的类
#include <QSqlRecord>   //数据库记录的类
#include <QMessageBox>  //消息对话框

namespace Ui {
class demo_zc;
}

class demo_zc : public QWidget
{
    Q_OBJECT

public slots:
    void jumpzc_slots();

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

private slots:
    void on_cancelBtn_clicked();

    void on_zcBtn_clicked();

private:
    Ui::demo_zc *ui;

    QSqlDatabase db;    //定义一个数据库的类对象
};

#endif // DEMO_ZC_H

#ifndef MYWIDGET_H
#define MYWIDGET_H      //防止文件重复引用

#include <QWidget>      //父类的头文件

#include <QDebug>       //信息调试类,用于输出数据使用
#include<QIcon>         //图标头文件
#include <QPushButton>  //按钮头文件
#include<QLineEdit>     //行类头文件
#include<QLabel>        //标签头文件
#include <QCheckBox>    //多选框头文件
#include <QMessageBox>  //对话框头文件
#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery>    //执行sql语句的类
#include <QSqlRecord>   //数据库记录的类
#include <QMessageBox>  //消息对话框

#include "demo.h"
#include "demo_zc.h"


QT_BEGIN_NAMESPACE
namespace Ui { class myWidget; }    //声明ui界面对应的头文件中的命名空间,这里不需要,注释掉
QT_END_NAMESPACE

//自定义了myWidget类,公共继承了Qwidget类
class myWidget : public QWidget
{
    Q_OBJECT    //信号与槽的元对象,没有这个对象,信号与槽就不能使用了

signals:
    void jump();
    void jump_zc();

//槽函数
public slots:
    void on_bn_dl_clicked();
    void on_bn_qx_clicked();
    void on_bn_zczh_clicked();


//公共函数
public:
    myWidget(QWidget *parent = nullptr);    //构造函数的声明
    ~myWidget();        //析构函数的声明

//私有成员
private:
//    Ui::myWidget *ui;   //可以通过该指针调用ui界面上拖拽出来的组件,这里不用,注释掉
    QLineEdit *mm;
    QLineEdit *zh;
    QPushButton *bn_dl;
    QPushButton *bn_qx;
    QPushButton *bn_zczh;
    demo *demo1;
    demo_zc *demo_zc1;

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

三个源文件:

#include "demo.h"
#include "ui_demo.h"



void demo::jump_slots()
{
    this->show();
}

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

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

#include "demo_zc.h"
#include "ui_demo_zc.h"

void demo_zc::jumpzc_slots()
{
    this->show();
}

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

    //判断自己的数据库对象中,是否包含要处理的数据库,如果没有包含则添加一个数据库,如果包含了,就可以打开了
    if(!db.contains("mydatabase.db"))
    {
        //则添加一个数据库,调用类中的静态成员函数addDatabase
        //函数原型:static QSqlDatabase addDatabase(const QString& type);
        //参数:驱动类型
        //返回值:数据库对象
        db=QSqlDatabase::addDatabase("QSQLITE");

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

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

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

//关闭注册界面
void demo_zc::on_cancelBtn_clicked()
{
    this->hide();
}

//注册账号,把账号添加到数据库中
void demo_zc::on_zcBtn_clicked()
{
    //获取ui界面中要录入的数据
    QString QQid=ui->zhEdit->text();
    QString mm=ui->mmEdit->text();

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

    //准备sql语句
    QString sql=QString("insert into zhanghao(QQid,password) "
                "values('%1','%2')").arg(QQid).arg(mm);
//    qDebug()<<sql;
    //准备语句执行者
    QSqlQuery query;
    if(!query.exec(sql))
    {
        QMessageBox::warning(this,"失败","注册失败");
        return;
    }else
    {
        QMessageBox::information(this,"成功","注册成功");
    }

}

#include "mywidget.h"
//#include "ui_mywidget.h"


myWidget::myWidget(QWidget *parent)
    : QWidget(parent)   //显行调用父类的有参构造完成对子类从父类继承下来成员的初始化工作
//    , ui(new Ui::myWidget)  //给自己类中的指针成员初始化空间,ui界面中拖拽出来的组件在这个对象中,这里不用,注释掉
{
//    ui->setupUi(this);  //调用ui::myWidget里面的成员函数,给拖拽的组件实例化空间,并设置相关属性,这里不用, 注释掉
    //这里开始写所有界面设置

    //设置大窗口属性
    this->setFixedSize(530,399);//设置固定尺寸
    this->setWindowTitle("时光QQ"); //设置当前的窗口标题
    this->setWindowIcon(QIcon(":/icon/shiguang02.jpg")); //设置当前窗口的标题图标
    this->setStyleSheet("background-color:green;");

    //设置一个图形标签
    QLabel *picture1=new QLabel(this);
    picture1->resize(530,160);
    picture1->setPixmap(QPixmap(":/icon/00859H3cgy1hg9dl79dqpj32yo1o01ky.jpg"));
    picture1->setScaledContents(true);

    //设置登录图标
    QLabel *p1=new QLabel(this);
    p1->resize(60,50);
    p1->move(80,180);
    p1->setPixmap(QPixmap(":/icon/shiguang03.png"));
    p1->setScaledContents(true);

    //设置密码图标
    QLabel *p2=new QLabel(this);
    p2->resize(60,50);
    p2->move(p1->x(),p1->y()+80);
    p2->setPixmap(QPixmap(":/icon/shiguang01.jpg"));
    p2->setScaledContents(true);

    //设置登录行
    this->zh=new QLineEdit(this);
    zh->resize(300,50);
    zh->move(p1->x()+75,p1->y());
    zh->setStyleSheet("background-color:0;");
    zh->setPlaceholderText("请输入用户名");

    //设置密码行
    this->mm=new QLineEdit(this);
    mm->resize(300,50);
    mm->move(p2->x()+75,p2->y());
    mm->setStyleSheet("background-color:0;");
    mm->setPlaceholderText("请输入密码");
    mm->setEchoMode(QLineEdit::Password);

//    //自动登录和记住密码
//    QCheckBox *chb1=new QCheckBox(this);
//    chb1->setText("自动登录");
//    chb1->move(mm->x()+30,mm->y()+65);

//    QCheckBox *chb2=new QCheckBox(this);
//    chb2->setText("记住密码");
//    chb2->move(chb1->x()+160,chb1->y());

    // 注册账号
    this->bn_zczh=new QPushButton(this);
    bn_zczh->setIcon(QIcon("D://Qt-project//HUAQING23062//day8//icon//shiguang02.jpg"));
    bn_zczh->setText("注册");
    bn_zczh->setStyleSheet("background-color:white");
    bn_zczh->move(mm->x()-80,mm->y()+95);
    bn_zczh->resize(80,35);

    //登录按钮
    this->bn_dl=new QPushButton(this);
    bn_dl->setIcon(QIcon("D://Qt-project//HUAQING23062//day8//icon//shiguang02.jpg"));
    bn_dl->setText("登录");
    bn_dl->setStyleSheet("background-color:#138;");
    bn_dl->move(mm->x()+30,mm->y()+95);
    bn_dl->resize(80,35);

    //取消按钮
    this->bn_qx=new QPushButton(this);
    bn_qx->setIcon(QIcon("D://Qt-project//HUAQING23062//day8//icon//shiguang02.jpg"));
    bn_qx->setText("取消");
    bn_qx->setStyleSheet("background-color:#831;");
    bn_qx->move(bn_dl->x()+160,bn_dl->y());
    bn_qx->resize(80,35);

    //连接登录按钮的点击信号和槽函数
    connect(bn_dl,&QPushButton::clicked,this,&myWidget::on_bn_dl_clicked);
    //连接取消按钮的点击信号和槽函数
    connect(bn_qx,&QPushButton::clicked,this,&myWidget::on_bn_qx_clicked);
    //连接注册按钮的点击信号和槽函数
    connect(bn_zczh,&QPushButton::clicked,this,&myWidget::on_bn_zczh_clicked);


    demo1=new demo;
    //连接跳转信号和隔壁槽函数
    connect(this,&myWidget::jump,demo1,&demo::jump_slots);

    demo_zc1=new demo_zc;
    //连接跳转信号和隔壁槽函数
    connect(this,&myWidget::jump_zc,demo_zc1,&demo_zc::jumpzc_slots);



    //判断自己的数据库对象中,是否包含要处理的数据库,如果没有包含则添加一个数据库,如果包含了,就可以打开了
    if(!db.contains("mydatabase.db"))
    {
        //则添加一个数据库,调用类中的静态成员函数addDatabase
        //函数原型:static QSqlDatabase addDatabase(const QString& type);
        //参数:驱动类型
        //返回值:数据库对象
        db=QSqlDatabase::addDatabase("QSQLITE");

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

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



    //需要使用sql语句进行创建表的操作
    //准备aql语句
    QString sql="create table if not exists zhanghao("
                "QQid varchar(16) primary key,"         //账号
                "password varchar(16))";       //密码
    //准备语句执行者
    QSqlQuery query;
    //让语句执行者执行sql语句
    //函数原型:bool exec(const QString& query);
    //参数:要执行的sql语句
    //返回值:成功执行返回true,失败返回false
    if(!query.exec(sql))
    {
        QMessageBox::information(this,"失败","创建表失败");
        return;
    }



}

myWidget::~myWidget()
{
//    delete ui;    //释放指针空间,这里没有用到,注释掉
}

//定义登录按钮的槽函数
void myWidget::on_bn_dl_clicked()
{
    QString username,psd;
    username=zh->text();
    psd=mm->text();
    //准备aql语句
    QString sql = QString("select * from zhanghao where QQid='%1' AND password='%2'").arg(username).arg(psd);

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

    //执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"错误","账号或密码错误!");
        return;
    }

    if(querry.record().count()>0)
    {
        //对象版
        QMessageBox masg_login;
        masg_login.setIcon(QMessageBox::Information);
        masg_login.setInformativeText("点击ok后,将关闭整个登录界面,\n然后跳转到登录后的界面");
        masg_login.setWindowTitle("登录成功");
        masg_login.setStandardButtons(QMessageBox::Ok);
        masg_login.setDefaultButton(QMessageBox::Ok);
        int ret = masg_login.exec();               //展示对话框
        if(ret==QMessageBox::Ok)
        {
            qDebug()<<"111";
//            this->demo1->show();
            this->hide();
            emit jump();
//            this->demo1->show();
        }
    }else {
        //静态成员函数版
        int ret=QMessageBox::critical(this, "登录错误",
                             "账号密码不匹配,是否重新登录",
                             QMessageBox::Ok|QMessageBox::Cancel);

        if(ret==QMessageBox::Ok)
        {
            zh->clear();
            mm->clear();
        }else if(ret==QMessageBox::Cancel)
        {
            this->close();
        }

    }
}

//定义取消按钮的槽函数
void myWidget::on_bn_qx_clicked()
{
    //静态成员函数版
    int ret=QMessageBox::question(this, "提示",
                         "是否确定要退出登录?",
                         QMessageBox::Yes|QMessageBox::No);

    if(ret==QMessageBox::No)
    {
        bn_dl->click();
    }else if(ret==QMessageBox::Yes)
    {
        this->close();
    }
}

//定义注册按钮的槽函数
void myWidget::on_bn_zczh_clicked()
{
    //静态成员函数版
    int ret=QMessageBox::question(this, "提示",
                         "是否确定要进入注册账号页面?",
                         QMessageBox::Yes|QMessageBox::No);

    if(ret==QMessageBox::Yes)
    {
        emit jump_zc();

    }else if(ret==QMessageBox::No)
    {
//        this->close();
        qDebug()<<"用户取消进入注册\n";
    }

}


主函数运行文件:

#include "mywidget.h"    //引入自定义图形化界面类的头文件
#include <QApplication> //引入应用程序类的头文件


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //使用应用程序类,实例化一个应用程序的对象

    myWidget w;
    //用自定义的图形化界面类实例化一个对象

    w.show();
    //调用show函数展示界面,父类提供的,可以展示自己的组件,以自己作为父组件的所有子组件也会被展示出来

    return a.exec();
    //阻塞等待应用程序,防止应用程序结束,等待用户操作、等待信号与槽、等待事件发生
}

运行结果:
1
2
4

5
6

更多推荐

路由器端口转发

什么是路由器端口转发路由器端口转发是一种网络配置技术,用于将公共网络(如互联网)上的请求转发到私有网络中的特定设备或服务。它允许外部设备通过路由器访问内部网络中的设备或服务,实现网络上的通信和互动。路由器端口转发的作用路由器端口转发的作用是允许公共网络中的设备或用户通过路由器访问私有网络中的特定设备或服务。它可以实现以

LeetCode 1337. The K Weakest Rows in a Matrix【数组,二分,堆,快速选择,排序】1224

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及

STM32F4X UCOSIII 事件集

STM32F4XUCOSIII事件集事件的应用场景UCOSIII事件工作机制UCOSIII事件操作函数事件创建函数事件删除函数事件发送函数事件接收函数UCOSIII事件例程事件在RTOS中也是一种任务间同步的机制,事件不能传递数据。跟信号量不同的是,事件可以实现一对多,多对多的同步,也就是一个事件可以唤醒多个任务,一个

2022/9/13总结

Vue路由的封装抽离为了便于维护,我们通常需要将路由模块抽离出来在vue中,如果要写路径,可以写绝对路径使用@@代表从src目录下去寻找,能避免出现很多错误声明式导航--导航链接vue-router提供了一个全局组件router-link(取代a标签)配置to属指定路径本质是a标签,to无需#优点:能高亮默认会提供高亮

人工智能AI 全栈体系(五)

第一章神经网络是如何实现的为什么使用ReLu函数?五、梯度消失问题1.什么是梯度消失问题?前面我们介绍的BP算法中,是这样更新权重值的:δ∗h=oh(1−oh)∑∗k∈后续(h)δ∗kw∗kh\delta*h=o_h(1-o_h)\sum*{k\in后续(h)}\delta*kw*{kh}δ∗h=oh​(1−oh​)∑

百度SEO优化不稳定的原因分析(提升网站排名的稳定性)

百度SEO优化不稳定介绍蘑菇号-www.mooogu.cnSEO不稳定是指网站在搜索引擎中的排名不稳定,随着时间的推移会发生变化。这种情况可能会出现在网站页面结构、内容质量、外链质量等方面存在缺陷或不合理之处。因此,优化SEO非常重要,可以提高网站的稳定性和排名。掌上帮教-www.zsbjiao.cn百度SEO不稳定因

Unity制作射击游戏案例01

整理逻辑思路://【业务逻辑】这个脚本用来1.控制物体移动旋转(WASD)、2.发射子弹(空格键)//【程序逻辑2】首先检测用户没有按下空格键2.如果按下呢执行发射子弹函数3.克隆子弹4.让克隆的子弹往前跑搭建场景为子弹模板添加刚体,并且限制旋转编写脚本:usingSystem.Collections;usingSys

MySQL 高级语句 Part1(进阶查询语句+MySQL数据库函数+连接查询)

高级语句第一部分一、MySQL进阶查询语句1.1select----显示表格中一个或数个字段的所有数据记录1.2distinct----不显示重复的数据记录1.3where----有条件查询1.4andor----且或1.5in----显示已知的值的数据记录1.6between----显示两个值范围内的数据记录1.7通

网络安全(黑客)自学

前言:作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。谈起黑客,可能各位都会想到:盗号,其实不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一般分为三大圈:娱乐圈技术圈职业圈。娱乐圈:主要是初中生和高中生较多,玩网恋,人气,空间,建站收徒玩赚钱,技术高的也是有的,只是很少见。技术圈:这个圈

英伟达 nvidia 官方code llama在线使用

新一代编程语言模型CodeLlama面世:重新定义编程的未来随着人工智能和机器学习技术的迅速发展,我们现在迎来了一款革命性的大型编程语言模型——CodeLlama。该模型是基于Llama2研发的,为开放模型中的佼佼者,其性能达到了行业领先水平。模型特点与亮点CodeLlama系列提供多种型号,以满足不同应用的需求。包括

C#流Stream与IO详解(4)——如何更快的读写文件

【前言】在我们追求更快读写速度时,通常都是为了读写二进制文件,而不是文本文件,所以这里只说FileStream、BinaryReader、BinaryWriter的使用。从前文的源码解读中能看到使用BinaryReader和BinaryWriter进行IO读写时本质还是调用了FileStream的接口,所以我们这里只说

热文推荐