QT Day5

2023-09-21 20:55:45

目录

1.针对登入框,新加入了注册功能,使用数据库存储账号密码信息

widget.h

widget.cpp

second.h

second.cpp

2.思维导图


1.针对登入框,新加入了注册功能,使用数据库存储账号密码信息

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QPushButton>
#include<QLineEdit>
#include<QLabel>
#include<QFont>
#include<QMessageBox>
#include<QDebug>
#include"second.h"
#include<QSqlDatabase>     //数据库管理类
#include<QSqlQuery>   //执行sql语句的类
#include<QSqlRecord>    //数据库记录的类


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

signals:                    //该权限下定义属于自己的信号
    void my_signal();           //自定义一个无参无返回值的信号函数
    void jump();    //自定义跳转的信号函数;

private slots:
    void my_slot();                //自定义无参无返回值的槽函数
    void my_slot1();
    void my_slot3();
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QLabel* lab1;
    QLabel* lab2;
    QLabel* lab3;
    QLineEdit* edit1;
    QLineEdit* edit2;
    QPushButton *btn1;
    QPushButton *btn2;
    QPushButton *btn3;
    void on_quesBtn_clicked();
    void on_critBtn_clicked();
    void on_infoBtn_clicked();

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

widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

    this->setFixedSize(800,600);     //设置固定尺寸
    this->setWindowTitle("Widget");     //设置窗口标题
    this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));    //设置窗口图标

    //实例化标签
    lab1=new QLabel(this);
    lab1->setPixmap(QPixmap("D:\\qt23062\\day8\\logo.png"));     //设置图片
    lab1->setScaledContents(true);     //设置图片自动适应大小
    lab1->resize(800,270);           //重新设置尺寸
    //标签2
    lab2=new QLabel(this);
    lab2->setPixmap(QPixmap(":/userName.jpg"));     //设置图片
    lab2->setScaledContents(true);     //设置图片自动适应大小
    lab2->resize(60,60);           //重新设置尺寸
    lab2->move(200,300);

    //标签3
    lab3=new QLabel(this);
    lab3->setPixmap(QPixmap(":/passwd.jpg"));     //设置图片
    lab3->setScaledContents(true);     //设置图片自动适应大小
    lab3->resize(60,60);           //重新设置尺寸
    lab3->move(lab2->x(),lab2->y()+90);

    //行编辑器
    edit1=new QLineEdit("",this);
    edit1->setPlaceholderText("账号");
    edit1->move(lab2->x()+75,lab2->y());
    edit1->resize(360,60);

    edit2=new QLineEdit("",this);
    edit2->setPlaceholderText("密码");
    edit2->move(lab3->x()+75,lab3->y());
    edit2->resize(360,60);
    edit2->setEchoMode(QLineEdit::Password);        //设置回显模式

    //按钮
    btn1=new QPushButton(QIcon(":/login.png"),"登录",this);
    btn1->move(edit2->x()+50,edit2->y()+100);
    btn1->resize(110,70);           //重新设置尺寸

    QFont font = btn1->font();
    font.setPointSize(16);  // 设置字体大小为16像素
    btn1->setFont(font);

    QPushButton *btn2=new QPushButton(QIcon(":/cancel.png"),"取消",this);
    btn2->move(btn1->x()+150,btn1->y());
    btn2->resize(110,70);           //重新设置尺寸

    QFont font1 = btn2->font();
    font1.setPointSize(16);  // 设置字体大小为16像素
    btn2->setFont(font1);

    btn3=new QPushButton("注册",this);
    btn3->move(btn1->x()-150,btn1->y());
    btn3->resize(110,70);
    QFont font2 = btn3->font();
    font2.setPointSize(16);  // 设置字体大小为16像素
    btn3->setFont(font2);

    //连接
    connect(btn3, &QPushButton::clicked, this, &Widget::my_slot3);
    connect(btn1, &QPushButton::clicked, this, &Widget::my_slot);
    connect(btn2, &QPushButton::clicked, this, &Widget::my_slot1);
    connect(this,&Widget::my_signal,this,&Widget::close);


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

        db=QSqlDatabase::addDatabase("QSQLITE");

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

    }

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

    //需要使用sql语句进行创建表的操作
    //准备sql语句
    QString sql="create table if not exists id ("             //创建表
                    "acc varchar(20) primary key,"             //账号,主键
                "pas varchar20)";                       //密码

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

    //让语句执行者执行sql语句
    //返回值bool类型
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"失败","创建表失败");
        return;
    }

}

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

//槽函数
void Widget::my_slot()
{
    QString sql="select * from id";
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","系统错误");
        return ;
    }
    int flag=0;
    while(querry.next())
    {
        if(edit1->text()==querry.record().value(0).toString()&&querry.record().value(1).toString()==edit2->text())
        {
            on_infoBtn_clicked();   //登入成功函数
            flag=1;
            break;
        }
    }
    if(0==flag)
    {
        //错误对话框
        on_critBtn_clicked();
    }
}

void Widget::my_slot1()
{
    //问题对话框
    on_quesBtn_clicked();
}

void Widget::my_slot3()
{
    //注册数据
    //获取ui界面中要录入的数据
     QString acc=edit1->text();   //账号
     QString pas=edit2->text();   //密码

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

     //准备sql语句
     QString sql=QString("insert into id(acc,pas)"
                 "values('%1','%2')").arg(acc).arg(pas);

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

}

//问题对话框
void Widget::on_quesBtn_clicked()
{
    //1.调用构造函数实例化对象
    QMessageBox box(QMessageBox::Question,              //图标
                    "问题对话框",                              //对话框标题
                    "是否确定要退出登入",                            //对话框文本内容
                    QMessageBox::Yes|QMessageBox::No,       //提供的按钮
                    this);                              //父组件
    //box.setDetailedText("有上好的飞天茅台");    //提供详细文本内容
    //box.setDefaultButton(QMessageBox::No);    //将no设置成默认按钮

    //2.调用exec函数运行对话框
    int ret=box.exec();

    //3.对结果进行判断
    if(ret==QMessageBox::Yes)
    {
        emit my_signal();

    }else if(ret==QMessageBox::No)
    {

    }
}

//信息对话框
void Widget::on_infoBtn_clicked()
{
    //直接调用静态成员函数完成对话框的实现
    int ret=QMessageBox::information(this,              //父组件
                         "信息对话框",              //对话框标题
                         "登入成功",     //对话框文本内容
                         QMessageBox::Ok,          //对话框提供的按钮
                         QMessageBox::Ok);              //默认选中的按钮
    if (ret==QMessageBox::Ok)
    {
        emit my_signal();
        emit jump();
    }
}

//错误对话框
void Widget::on_critBtn_clicked()
{
    //1.调用构造函数实例化对象
    QMessageBox box(QMessageBox::Critical,              //图标
                    "错误对话框",                              //对话框标题
                    "账号密码不匹配,是否重新登入",                            //对话框文本内容
                    QMessageBox::Yes|QMessageBox::No,       //提供的按钮
                    this);                              //父组件
    //box.setDetailedText("账号密码不匹配,是否重新登入");    //提供详细文本内容
    //box.setDefaultButton(QMessageBox::No);    //将no设置成默认按钮
    box.setButtonText(QMessageBox::Yes,"OK");
    box.setButtonText(QMessageBox::No,"cancel");

    //2.调用exec函数运行对话框
    int ret=box.exec();

    //3.对结果进行判断
    if(ret==QMessageBox::Yes)
    {
        edit2->clear();

    }else if(ret==QMessageBox::No)
    {
        emit my_signal();
    }
}












second.h

#ifndef SECOND_H
#define SECOND_H

#include <QWidget>

namespace Ui {
class Second;
}

class Second : public QWidget
{
    Q_OBJECT

public slots:
    void jump_slot();    //接收跳转信号的槽函数
public:
    explicit Second(QWidget *parent = nullptr);
    ~Second();

private:
    Ui::Second *ui;
};

#endif // SECOND_H

second.cpp

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

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

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

//接收跳转信号对应的槽函数
void Second::jump_slot()
{
    this->show();   //
}

2.思维导图

更多推荐

Intel汇编在VS下开发的环境配置

1.创建一个C/C++的空项目2.创建汇编源码文件,就是C++文件改后缀为asm3.在生成依赖项一栏中选择自定义4.选择masm5.在源文件上右击选择属性6.这么设置一下7.为了让代码看的更舒服一些,添加一些高亮插件8.安装AsmHighligher和AsmDude插件(非必须),其中前者主要是高亮配色(个人很喜欢这个

Android存储权限完美适配(Android11及以上适配)

一、Bug简述一个很普通的需求,需要下载图片到本地,我的三个测试机(荣耀Android10,红米11和小米Android13都没有问题)。然后,主角登场了,测试的三星Android13死活拉不起存储权限弹窗。想了下,三星的系统可能和小米的系统做了些区别。于是就是看了下存储权限的版本更迭,却是发现了些骚东西。二、原因很早

Java Script

初识JavaScriptJavaScript是什么?JavaScript(简称JS)是世界上最流行的编程语言之一是一个脚本语言,通过解释器运行主要在客户端(浏览器)上运行,现在也可以基于node.js在服务器端运行JavaScript最初只是为了完成简单的表单验证(验证数据合法性),结果后来不小心就火了.当前JavaS

Android 显示surfaceFlinger vsync 获取

文章目录vsync的概念vsync应用层获取的方式vsync信号传递vsync的概念vsync简单理解就是一帧图像在显示设备这边显示完成之后(图像从左上角扫描到了右下角了)发送的第一个硬件vsync信号,显示设备重新回到左上角开始显示的时候会在发第二个vsync信号。在发送第一个vsync信号出来的时候,上层要开始准备

IP归属地在金融行业的应用场景

IP归属地查询在各大行业当中的利用率可以说非常的高了,提供了各种的保障,比如安全保障、数据保障、性能保障等等。今天我就来详细说一说IP归属地在金融行业的应用场景有哪些?用途一:通过解析用户IP地址所处的区县位置与表单填写位置或者GPS位置进行交叉验证,判断位置是否一致;用途二:识别来自高危地区的IP地址,如缅甸、老挝;

【面试题】—— 笔试题(4题)

文章目录1.分割集合第一种方式:自己实现分割方法第二种方式:使用第三方依赖2.链表计算3.字符串计算4.找到相加为0的数字1.分割集合题目:编写一个Java函数,实现批量获取数据的功能(BService.get(Listids))。具体要求如下:1)提供一个函数BService.get(Listids),支持最多传入1

使用Jmeter+ant进行接口自动化测试(数据驱动)

最近在做接口测试,因为公司有使用jmeter做接口测试的相关培训资料,所以还是先选择使用jmeter来批量管理接口,进行自动化测试。话不多说,进入正题:1.使用csv文件保存接口测试用例,方便后期对接口进行维护(先新建txt文件,然后文件扩展名改为.csv,不要新建xls再改为csv,不然会出现读取不到文件的情况)注意

【C语言学习笔记---指针进阶02】

C语言程序设计笔记---017C语言进阶之回调函数1、函数指针数组2、回调函数3、回调函数的应用---qsort库函数4、模拟qsort函数5、结语C语言进阶之回调函数前言:通过C语言进阶前篇的指针进阶01的知识,继续学习。这篇引用一个简易计算器的程序进行深入学习指针进阶的知识。/知识点汇总/1、函数指针数组比如:指针

认识Redis

文章目录为什么需要使用缓存中间件提高读取性能降低数据库负载提高可伸缩性降低外部依赖提高用户体验缓存数据一致性应对突发流量缓存的类型本地缓存分布式缓存内存缓存磁盘缓存缓存代理什么是RedisRedis和Memcached对比数据结构支持持久化支持数据查询和操作数据复制和分布式内存管理:生态系统和支持库应用场景总结为什么用

【大数据】Doris 构建实时数仓落地方案详解(二):Doris 核心功能解读

本系列包含:Doris构建实时数仓落地方案详解(一):实时数据仓库概述Doris构建实时数仓落地方案详解(二):Doris核心功能解读Doris构建实时数仓落地方案详解(三):Doris实时数仓设计Doris构建实时数仓落地方案详解(二):Doris核心功能解读1.Doris发展历程2.Doris三大模型3.Doris

Wireshark TS | MQ 传输缓慢问题

问题背景应用传输慢是一种比较常见的问题,慢在哪,为什么慢,有时候光从网络数据包分析方面很难回答的一清二楚,毕竟不同的技术方向专业性太强,全栈大佬只能仰望,而我们能做到的是在专注于自身的专业方向之外,尽量扩展知识面,学会找出问题的规律,并提出可能的解决建议。就像本次MQ案例一样,说实话我对MQ一无所知,但并不会让我们在拿

热文推荐