【QT】day5

news2024/11/26 2:48:54

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

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

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

相关文章

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题 Java 的 Interface 是干什么 解答 上面的这个问题应该还是比较好回答的吧。 只要你做过 Java &#xff0c;通常 Interface 的问题多多少少会遇到&#xff0c;而且可能会遇到一大堆。 在JAVA编程语言中是一个抽象类型&#xff08;Abstract Type&#xff09;&…

SpringBoot之静态资源规则与定制化

文章目录 前言一、静态资源访问二、静态资源访问前缀三、webjar资源处理的默认规则 四、welcome与favicon功能1.欢迎页支持欢迎页处理规则 2.自定义Favicon 五、补充总结 前言 本文主要介绍关于SpringBoot中Web开发的简单功能。 一、静态资源访问 只要静态资源放在类路径下&am…

物联网安全优秀实践:2023年设备保护指南

物联网的发展可谓是革命性的&#xff0c;数十亿台设备实时互连、通信和共享数据。因此&#xff0c;考虑物联网安全的最佳实践至关重要。 物联网的重要性日益上升 在数字时代&#xff0c;物联网(IoT)已成为一股革命力量&#xff0c;重塑了企业运营和个人生活方式。从调节家庭温…

基于win32实现TB登陆滑动验证

这里写目录标题 滑动验证触发条件&#xff1a;失败条件&#xff1a;解决方法:清除cooKie 滑动验证方式一&#xff1a;win32 api获取窗口句柄&#xff0c;选择固定位置 成功率高方式二&#xff1a; 原自动化滑动&#xff0c;成功率中 案例 先谈理论&#xff0c;淘宝 taobao.com …

A Span-based Multi-Modal Attention Network for joint entity-relationextraction

原文链接&#xff1a; https://www.sciencedirect.com/science/article/pii/S0950705122013247?via%3Dihub Knowledge-Based Systems 2023 介绍 作者认为当前基于span的关系提取方法都太关注于span内部的语义&#xff0c;忽略了span与span之间以及span与其他模态之间&#xff…

腾讯云服务器16核 32G 28M带宽租用价格、性能测评及配置大全

腾讯云轻量应用服务器16核32G28M配置优惠价3468元15个月&#xff08;支持免费续3个月/送同配置3个月&#xff09;&#xff0c;轻量应用服务器具有100%CPU性能&#xff0c;系统盘为380GB SSD盘&#xff0c;28M带宽下载速度3584KB/秒&#xff0c;月流量6000GB&#xff0c;折合每天…

C语言入门Day_23 指针的使用

目录 前言&#xff1a; 1.指针运算符 2.指针的运算和使用 3.易错点 4.思维导图 前言&#xff1a; 上一篇博客中我们了解到指针的两个运算符号"&#xff1a; 一个是星号*&#xff0c;一个是&&#xff0c;他们的名字分别是指针运算符和取地址运算符。 1.指针运算…

【JAVA】关于抽象类的概念

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 前言 在Java中&#xff0c;抽象类是一种特殊的类&#xff0c;它无法被实例化。它只能被用作其他类的基类&#xff0c;以便子类可以继承它的属性和方法。今天我们就来谈谈JAVA中的抽象类。…

爬虫 — App 爬虫(一)

目录 一、介绍二、APP 爬虫常见反爬三、APP 抓包常用工具四、模拟器五、安装 APP1、下载 APP2、安装 APP 六、fiddler1、工作原理2、安装3、基本介绍 七、环境配置1、fiddler 的配置2、夜神模拟器的配置 八、案例 一、介绍 爬虫分类——数据来源 1、PC 端爬虫&#xff08;网页…

IP风险查询:抵御DDoS攻击和CC攻击的关键一步

随着互联网的普及&#xff0c;网络攻击变得越来越普遍和复杂&#xff0c;对企业和个人的网络安全构成了重大威胁。其中&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击和CC&#xff08;网络连接&#xff09;攻击是两种常见且具有破坏性的攻击类型&#xff0c;它们…

十、阶段实践练习

阶段实践练习 1.阶段实践练习1.1.练习1~~~~象棋口诀1.2.练习2~~~~输出汇款单1.3.练习3~~~~输出个人信息1.4.练习4~~~~计算月收入1.5.练习5~~~~计算商和余数1.6.练习6~~~~判断成绩能否及格1.7.练习7~~~~话费充值1.8.练习8~~~~货车装西瓜 ———————————————————…

一百八十一、Hive——海豚调度HiveSQL任务时当Hive的计算引擎是mr或spark时脚本的区别(踩坑,附截图)

一、目的 当Hive的计算引擎是spark或mr时&#xff0c;发现海豚调度HQL任务的脚本并不同&#xff0c;mr更简洁 二、Hive的计算引擎是Spark时 &#xff08;一&#xff09;海豚调度脚本 #! /bin/bash source /etc/profile nowdatedate --date0 days ago "%Y%m%d" y…

[Git入门]---gitee注册及代码提交

文章目录 1.Gitee是什么2.gitee注册3.git工具及图形化界面工具安装4.gitee仓库创建5.进行本地仓库与远端gitee仓库的链接6.git三板斧addcommitpush 7.gitee提交代码常见问题 1.Gitee是什么 gitee是基于git代码托管和研发协作的国内平台&#xff0c;在上面可以托管个人或公司代…

XSS-labs1-20关通过手册

目录 XSSlabs1-20关通关手册第一关level-1&#xff08;无任何过滤&#xff09;第二关level-2&#xff08;闭合标签&#xff09;第三关level-3&#xff08;单引号闭合js事件函数绕过&#xff09;第四关level-4&#xff08;双引号闭合js事件函数绕过&#xff09;第五关level-5&am…

Excel 拆分单元格数据(公式拆分、智能填充、分列)

将姓名工号拆分成 姓名 和 工号 方法1 在 B2 单元格输入 LEFT($A2, FIND(":", $A2) - 1)在 C2 单元格输入 RIGHT($A2, LEN($A2) - FIND(":", $A2))然后 ctrl d 向下填充即可 方法2 在 B2 单元格输入 李金秀&#xff0c;然后选中 B3 单元格&#xff0c…

LeetCode 753. 破解保险箱【欧拉回路,DFS】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

实现AIGC更好的数据存力,这家科技巨头为我们指明了方向

存力即数据存储能力 蕴藏着巨大的发展机会 【全球存储观察 &#xff5c; 热点关注】 2023年&#xff0c;全球被ChatGPT的热潮席卷&#xff0c;拥抱AIGC的创新赛道成为众多企业的新选择。 全球存储观察分析指出&#xff0c;影响AIGC发展的三大因素也日益凸显&#xff0c;即算…

ROS之创建第一个程序

打开终端 创建工作空间 mkdir ros_ws进入工作空间 cd ros_ws创建src文件夹&#xff08;放源程序&#xff09; mkdir src编译工作空间 catkin_make打开vscode&#xff08;从终端打开此工程&#xff09; code .进入src文件夹 cd src创建功能包demo1&#xff0c;并加载依赖…

[Linux入门]---Linux编译器gcc/g++使用

文章目录 1.背景知识2.gcc如何完成编译运行工作预处理&#xff08;进行宏替换&#xff09;编译&#xff08;生成汇编&#xff09;汇编&#xff08;生成机器可识别代码&#xff09;链接&#xff08;生成可执行文件&#xff09; 3.函数库动态库静态库动静态库的区别 4.gcc选项 1.…

一键自助建站系统源码带安装教程 傻瓜式部署搭建,让您的建站更高效

在这个数字时代&#xff0c;网站已成为企业或个人展示形象、推广业务的重要工具。为了满足这一需求&#xff0c;许多自助建站系统应运而生&#xff0c;大大降低了用户建站的门槛。给大家分享一款傻瓜式部署搭建的一键自助建站系统源码&#xff0c;让您轻松拥有高效建站能力。 …