Cpp/Qt-day050921Qt

目录

实现使用数据库的登录注册功能

头文件:

registrwidget.h:

widget.h:

源文件:

registrwidget.c:

widget.h:

效果图:

思维导图


实现使用数据库的登录注册功能
头文件:
registrwidget.h:
#ifndef REGISTRWIDGET_H
#define REGISTRWIDGET_H#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QMessageBox>
#include <QSqlDatabase>     //数据库管理类
#include <QSqlQuery>        //执行sql语句的类
#include <QSqlRecord>       //记录数据库记录的类namespace Ui {
class registrwidget;
}class registrwidget : public QWidget
{Q_OBJECT
public slots:void jumpToRegister_slot();public:explicit registrwidget(QWidget *parent = nullptr);~registrwidget();// void jumpToWid();void cancel_btn_clicked_slot();void register_btn_clicked_slot();private:Ui::registrwidget *ui;QPushButton *register_btn;QPushButton *cancel_btn;QLabel *lab1;QLineEdit *edit1;QLineEdit *edit2;QLineEdit *edit3;QLabel *lab2;QLabel *lab3;QLabel *lab4;QSqlDatabase db;        //定义一个数据库的类对象//Widget *wid;
};#endif // REGISTRWIDGET_H
widget.h:
#ifndef WIDGET_H
#define WIDGET_H#include "registrwidget.h"
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QObject>
#include <QMessageBox>
#include <QSqlDatabase>     //数据库管理类
#include <QSqlQuery>        //执行sql语句的类
#include <QSqlRecord>       //记录数据库记录的类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();signals://void jumpToLogin();void jumpToRegister();public slots:void loginBtn_slot();void cancelBtn_slot();void registerBtn_slot();private:Ui::Widget *ui;QLabel *lab1;QLineEdit *edit1;QLineEdit *edit2;QLabel *lab2;QLabel *lab3;QPushButton *btn1;QPushButton *btn2;QPushButton *btn3;QSqlDatabase db;        //定义一个数据库的类对象//login *l1;registrwidget *reg_wid;
};
#endif // WIDGET_H
源文件:
registrwidget.c:
#include "registrwidget.h"
#include "ui_registrwidget.h"void registrwidget::jumpToRegister_slot()
{this->show();   //展示自己的界面
}registrwidget::registrwidget(QWidget *parent) :QWidget(parent),ui(new Ui::registrwidget)
{ui->setupUi(this);//判断自己的数据库对象中是否包含了要处理的数据库,如果没有就添加,如果包含就打开if(!db.contains("registeredusr.db")){//添加一个数据库db = QSqlDatabase::addDatabase("QSQLITE");//设置数据库的名字db.setDatabaseName("registeredusr.db");}//此时已经有一个名为registeredusr.db的数据库//打开数据库if(!db.open()){QMessageBox::critical(this, "失败", "打开失败");return;}//说明数据库打开成功//需要使用sql语句进行创建表的操作//准备sql语句QString sql("create table if not exists regedusr("       //创建表"usrname varchar(20) primary key,"              //账号"passwd varchar(20))");             //密码//准备语句执行者QSqlQuery query;//让语句执行者执行sql语句if(!query.exec(sql)){QMessageBox::critical(this, "失败", "创建失败");return;}//将图形化界面的名字改成Login screen(登录界面)this->setWindowTitle("Register screen");//将ui的图标改成想要的this->setWindowIcon(QIcon(":/icon/wodepeizhenshi.png"));//设置ui界面的大小为合适的大小this->setFixedSize(QSize(400,300));//插入一个label,它的宽度与ui等宽,高度大约为整个ui界面高度的4/9lab1 = new QLabel(this);lab1->resize(QSize(400,133));lab1->move(0,0);//label的内容要是一张图片lab1->setPixmap(QPixmap(":/icon/logo.png"));//设置图片填充lab1->setScaledContents(true);//插入两个行编辑器,第一个用于输入账号edit1 = new QLineEdit(this);edit1->resize(QSize(240,30));edit1->move(110,145);edit1->setPlaceholderText("账号");//第二个用于输入密码edit2 = new QLineEdit(this);edit2->resize(QSize(240,30));edit2->move(edit1->x(),edit1->y()+35);edit2->setPlaceholderText("密码");//第二个回显模式是密码模式edit2->setEchoMode(QLineEdit::Password);//第三个用于确认密码edit3 = new QLineEdit(this);edit3->resize(QSize(240,30));edit3->move(edit1->x(),edit2->y()+35);edit3->setPlaceholderText("请确认密码");//第三个回显模式也是密码模式edit3->setEchoMode(QLineEdit::Password);//每个行编辑器前都要有一个label,内容为图片lab2 = new QLabel(this);lab2->resize(37,30);lab2->setPixmap(QPixmap(":/icon/userName.jpg"));lab2->setScaledContents(true);lab2->move(edit1->x()-60,edit1->y());lab3 = new QLabel(this);lab3->resize(37,30);lab3->setPixmap(QPixmap(":/icon/passwd.jpg"));lab3->setScaledContents(true);lab3->move(edit2->x()-60,edit2->y());lab4 = new QLabel(this);lab4->resize(37,30);lab4->setPixmap(QPixmap(":/icon/passwd.jpg"));lab4->setScaledContents(true);lab4->move(edit3->x()-60,edit3->y());//实例化登录按钮和退出按钮register_btn = new QPushButton("注册", this);cancel_btn = new QPushButton("取消", this);register_btn->resize(60,30);cancel_btn->resize(60,30);register_btn->move(120, edit3->y()+45);cancel_btn->move(register_btn->x()+120, register_btn->y());//将取消按钮的按下信号与对应的槽函数连接,点击取消就关闭注册界面connect(cancel_btn, &QPushButton::clicked, this, &registrwidget::cancel_btn_clicked_slot);//将注册按钮的按下信号与对应的槽函数连接,点击注册就进行对应的操作connect(register_btn, &QPushButton::clicked, this, &registrwidget::register_btn_clicked_slot);
}registrwidget::~registrwidget()
{delete ui;
}void registrwidget::cancel_btn_clicked_slot()
{//使用静态成员函数的方式打开一个对话框int ret = QMessageBox::question(this,"取消","是否确认取消注册",QMessageBox::Yes|QMessageBox::No,QMessageBox::No);switch (ret) {case QMessageBox::Yes://确认就退出this->close();break;case QMessageBox::No://否就不进行任何操作break;default://应该不会有这种可能性break;}
}void registrwidget::register_btn_clicked_slot()
{QString usrname = edit1->text();QString passwd = edit2->text();QString repasswd = edit3->text();//确保每个容器中都有数据if(usrname.isEmpty() ||passwd.isEmpty() || repasswd.isEmpty()){QMessageBox::warning(this, "警告", "请将信息填写完整");return;}//判断,如果两个密码输入框中的密码不同,就给出消息框提示,并清空密码框if(passwd != repasswd){QMessageBox::critical(this, "错误", "请确保两次密码都输入正确");edit2->clear();edit3->clear();return;}//此时,容器中都有数据,且确认密码正确,判断用户名是否存在//准备sql语句QString sql = QString("select passwd from regedusr where usrname='%1';").arg(usrname);//准备语句执行者QSqlQuery query;//让语句执行者执行sql语句if(!query.exec(sql)){QMessageBox::critical(this, "失败", "注册失败");return;}if(query.next()){QMessageBox::critical(this, "失败", "用户名已存在");return;}//此时可以进行插入操作//准备sql语句sql = QString("insert into regedusr(usrname, passwd)""values('%1', '%2')").arg(usrname).arg(passwd);//让语句执行者执行sql语句if(!query.exec(sql)){QMessageBox::critical(this, "失败", "注册失败");return;}//此时注册成功QMessageBox::information(this, "成功", "注册成功");//注册成功后自动退出注册界面this->close();}
widget.h:
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);reg_wid = new registrwidget;//判断自己的数据库对象中是否包含了要处理的数据库,如果没有就添加,如果包含就打开if(!db.contains("registeredusr.db")){//添加一个数据库db = QSqlDatabase::addDatabase("QSQLITE");//设置数据库的名字db.setDatabaseName("registeredusr.db");}//此时已经有一个名为registeredusr.db的数据库//打开数据库if(!db.open()){QMessageBox::critical(this, "失败", "打开失败");return;}//说明数据库打开成功//需要使用sql语句进行创建表的操作//准备sql语句QString sql("create table if not exists regedusr("       //创建表"usrname varchar(20) primary key,"              //账号"passwd varchar(20))");             //密码//准备语句执行者QSqlQuery query;//让语句执行者执行sql语句if(!query.exec(sql)){QMessageBox::critical(this, "失败", "创建失败");return;}//将图形化界面的名字改成Login screen(登录界面)this->setWindowTitle("Login screen");//将ui的图标改成想要的this->setWindowIcon(QIcon(":/icon/wodepeizhenshi.png"));//设置ui界面的大小为合适的大小this->setFixedSize(QSize(400,300));//插入一个label,它的宽度与ui等宽,高度大约为整个ui界面高度的4/9lab1 = new QLabel(this);lab1->resize(QSize(400,133));lab1->move(0,0);//label的内容要是一张图片lab1->setPixmap(QPixmap(":/icon/logo.png"));//设置图片填充lab1->setScaledContents(true);//插入两个行编辑器,第一个用于输入账号edit1 = new QLineEdit(this);edit1->resize(QSize(240,40));edit1->move(110,150);edit1->setPlaceholderText("账号");//第二个用于输入密码edit2 = new QLineEdit(this);edit2->resize(QSize(240,40));edit2->move(edit1->x(),edit1->y()+55);edit2->setPlaceholderText("密码");//第二个回显模式是密码模式edit2->setEchoMode(QLineEdit::Password);//每个行编辑器前都要有一个label,内容为图片lab2 = new QLabel(this);lab2->resize(50,40);lab2->setPixmap(QPixmap(":/icon/userName.jpg"));lab2->setScaledContents(true);lab2->move(edit1->x()-60,edit1->y());lab3 = new QLabel(this);lab3->resize(50,40);lab3->setPixmap(QPixmap(":/icon/passwd.jpg"));lab3->setScaledContents(true);lab3->move(edit2->x()-60,edit2->y());//要有两个pushbutton,一个是登录另一个是取消btn1 = new QPushButton("登录",this);btn2 = new QPushButton("取消",this);//重设他们的尺寸btn1->resize(QSize(60,30));btn2->resize(btn1->size());//移动他们的位置到合适btn1->move(170,edit2->y()+55);btn2->move(270,edit2->y()+55);//内容都会有一个图片btn1->setIcon(QIcon(":/icon/login.png"));btn2->setIcon(QIcon(":/icon/cancel.png"));//实例化一个注册按钮btn3 = new QPushButton("注册", this);btn3->resize(btn1->size());//移动到一个合适的位置btn3->move(btn1->x()-100,btn1->y());//将登录按钮点击发信号与处理函数连接connect(this->btn1, &QPushButton::clicked, this, &Widget::loginBtn_slot);//将取消按钮点击发信号与处理函数连接connect(this->btn2, &QPushButton::clicked, this, &Widget::cancelBtn_slot);//将跳转信号与registrwidget界面的处理函数连接connect(this, &Widget::jumpToRegister, reg_wid, &registrwidget::jumpToRegister_slot);//将注册按钮点击信号与跳转向注册界面的信号连接,点击注册按钮自动跳转到注册界面connect(this->btn3, &QPushButton::clicked, this, &Widget::registerBtn_slot);}Widget::~Widget()
{delete ui;
}void Widget::loginBtn_slot()
{QString usrname = edit1->text();QString passwd = edit2->text();//准备sql语句//按照用户名查找密码项QString sql = QString("select passwd from regedusr where usrname='%1';").arg(usrname);//准备语句执行者QSqlQuery query;//让语句执行者执行sql语句if(!query.exec(sql)){QMessageBox::critical(this, "失败", "登录失败");return;}if(!query.next()){QMessageBox::critical(this, "登录失败", "用户名不存在,请先注册");edit2->clear();return;}else{//此时,数据表中对应的用户名是存在对应密码的if(passwd == query.value(0).toString()){//对象版实现打开一个信息对话框QMessageBox box(QMessageBox::Information,"登录成功","登录成功",QMessageBox::Ok,this);box.exec();}else{//对象版实现打开一个错误对话框QMessageBox box(QMessageBox::Critical,"错误","账号密码不匹配,是否重新登录",QMessageBox::Ok|QMessageBox::Cancel,this);//设置默认选择的按钮box.setDefaultButton(QMessageBox::Ok);int ret = box.exec();//有两个按钮,需要判断if(QMessageBox::Ok==ret){edit2->clear();}else{this->close();}}}
}void Widget::cancelBtn_slot()
{//使用静态成员函数的方式打开一个对话框int ret = QMessageBox::question(this,"请问","是否确认要退出",QMessageBox::Yes|QMessageBox::No,QMessageBox::No);switch (ret) {case QMessageBox::Yes://确认就退出this->close();break;case QMessageBox::No://否就不进行任何操作break;default://应该不会有这种可能性break;}
}void Widget::registerBtn_slot()
{emit jumpToRegister();
}
效果图:
使用一个未注册的账户进行登录:

点击注册:

如果用户名已注册:

正确输入账号和密码:

注册成功后登录的效果:

如果登录的时候密码错误:

思维导图

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

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

相关文章

【Kafka系列】(二)Kafka的基本使用

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 文章更新计划[2] 系列文章地址[3] Kafka 线上集群部署方案怎么做 操作系统 先说结论&#xff0c;Kafka 部署在 Linux 上要比 Window…

[网鼎杯 2020 朱雀组]Nmap 通过nmap写入木马 argcmd过滤实现逃逸

这道题也很好玩 啊 原本以为是ssrf 或者会不会是rce 结果是通过nmap写入木马 我们来玩一下 传入木马 映入眼帘是nmap 我们首先就要了解nmap的指令 Nmap 相关参数-iL 读取文件内容&#xff0c;以文件内容作为搜索目标 -o 输出到文件-oN 标准保存-oX XML保存-oG Grep保存-oA…

北工大汇编——综合题(2)

题目要求 编写一个比赛得分程序。共有7 个评委&#xff0c;按百分制打分&#xff0c;计分 原则是去掉一个最高分和一个最低分&#xff0c;求平均值。要求&#xff1a; 评委的打分以十进制从键盘输入。成绩以十进制给出&#xff0c;并保留 1位小数。输入输出时屏幕上要有相应提…

分治算法求解:逆序对,Max Sum,棋盘覆盖,a-Good String——中山大学软件工程学院算法第四次实验课 必做+选做题

写英文注释不是要“秀英文”&#xff0c;而是因为鄙人正在准备雅思&#xff0c;顺手练习 逆序对 题目描述 完整代码 #include<iostream> using namespace std; int num[500010]; // input numbers int tmp[500010]; // sequence after merging left and right part lon…

鼠标不动了怎么办?3招解决问题!

“这是怎么回事呢&#xff1f;我的鼠标怎么会用着用着就突然不动了呢&#xff1f;现在有一些比较重要的工作要处理。请问有什么方法可以快速解决这个问题吗&#xff1f;” 随着电脑在我们日常生活和工作中的广泛应用&#xff0c;鼠标是我们操作电脑不可或缺的工具之一。但是&am…

WebGL 绘制圆形的点

目录 前言 如何实现圆形的点&#xff1f; 片元着色器内置变量&#xff08;gl_FragCoord、gl_PointCoord&#xff09; gl_PointCoord的含义 示例程序&#xff08;RoundedPoint.js&#xff09; 代码详解 前言 本文将讨论示例程序RoundedPoint&#xff0c;该程序绘制了圆…

Spring底层原理之 BeanFactory 与 ApplicationContext

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring底层原理 一、 BeanFactory 与 Appli…

爬虫怎么批量采集完成任务

目录 一、了解网络爬虫 二、Python与网络爬虫 三、批量采集任务的实现 1.确定采集网站及关键词 2.安装相关库 3.发送请求并获取响应 4.解析HTML文档 5.提取文章内容 6.保存文章内容 7.循环采集多篇文章 8.增加异常处理机制 9.优化代码性能 四、注意事项 总结 在当…

登录业务实现 - token登录鉴权

登录业务实现&#xff1a; 登录成功/失败实现 -> pinia管理用户数据及数据持久化 -> 不同登录状态的模板适配 -> 请求拦截器携带token&#xff08;登录鉴权&#xff09; -> 退出登录实现 -> token失效&#xff08;401响应拦截&#xff09; 1. 登录成…

(循环)mysql定时器删除某表中数据例子

CREATE EVENT clear_interactive_logs ON SCHEDULE EVERY 1 DAY STARTS 2023-09-21 23:36:36 DO DELETE from t_interactive_log WHERE id not IN (SELECT * from (SELECT id from t_interactive_log ORDER BY occer_time DESC limit 20000) x ); END ———————————…

Java编程的精髓:深入理解JVM和性能优化

文章目录 Java虚拟机&#xff08;JVM&#xff09;的核心概念1. 类加载器&#xff08;Class Loader&#xff09;2. 内存区域3. 垃圾回收&#xff08;Garbage Collection&#xff09;4. 类型转换和多态 JVM性能调优1. JVM参数调整2. 内存管理3. 多线程优化4. 使用性能分析工具5. …

【技术分享】NetLogon于域内提权漏洞(CVE-2020-1472)

一、漏洞介绍 CVE-2020-1472是一个Windows域控中严重的远程权限提升漏洞。攻击者在通过NetLogon&#xff08;MS-NRPC&#xff09;协议与AD域控建立安全通道时&#xff0c;可利用该漏洞将AD域控的计算机账号密码置为空&#xff0c;从而控制域控服务器。该漏洞适用于Win2008及后…

C++:优先级队列模拟实现和仿函数的概念使用

文章目录 使用方法Compare仿函数一些场景模板参数和函数参数 本篇总结优先级队列 使用方法 首先在官网查看它的一些用法 template <class T, class Container vector<T>,class Compare less<typename Container::value_type> > class priority_queue;从…

S09-录入的数据快速分列

选中某一列数据&#xff0c;数据-》分列 确定分隔符

Blender导出FBX给UE5

最近在学习UE5的资源导入&#xff0c;总结如下&#xff1a; 建模使用Blender&#xff0c;UE5版本是5.3 1.纯静态模型导入UE5 Blender FBX导出设置保持默认即可&#xff0c; UE5把导入设置里Miscellaneous下Force Front XAxis和Convert Scene Unit勾选即可 2.带骨骼动画的模型…

命令执行(rce)

1.命令与代码执行原理 命令执行原理 参数给变量未经过滤&#xff0c;直接使用了不安全的函数处理了变量 127.0.0.1&&ipconfig 有漏洞 常用的函数 assert,system,exec,shell_exec, eval,(反单引号&#xff09; 代码执行原理 参数给变量未经过滤&#xff…

Postgresql源码(113)表达式JIT计算简单分析

相关 《Postgresql源码&#xff08;85&#xff09;查询执行——表达式解析器分析&#xff08;select 11如何执行&#xff09;》 《Postgresql源码&#xff08;113&#xff09;表达式JIT计算简单分析》 1 普通表达式计算 普通表达式计算发生在优化器preprocess_expression中&am…

Day1-DeepWalk

论文《DeepWalk: Online Learning of Social Representations》 2014年发表在数据挖掘顶会ACM SIGKDD&#xff08;KDD&#xff09;上的论文 目的&#xff1a;学习节点表示 推动&#xff1a;将自然语言处理里面的无监督学习方法迁移至此 思路&#xff1a;将图结构序列化&#x…

关于安卓SVGA浅尝(二)加载数据

关于安卓SVGA浅尝&#xff08;二&#xff09;加载数据 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项…

【Linux】系统编程基于环形队列生产者消费者模型(C++)

目录 【1】引入POSIX信号量 【1.1】初始化信号量 【1.2】销毁信号量 【1.3】等待信号量 【1.4】发布信号量 【2】基于环形队列的生产消费模型 【2.1】生产消费模型打印数字模型 【2.2】生产消费模型计算公式模型 【2.3】生产消费模型计算公式加保存任务模型 【1】引入…