Cpp/Qt-day050921Qt

news2024/11/24 16:31:10

目录

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

头文件:

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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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/9
    lab1 = 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/9
    lab1 = 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.coloradmin.cn/o/1029835.html

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

相关文章

爬虫 — 字体反爬

目录 一、安装字体软件 FontCreator二、百度智能云文字识别三、案例一四、案例二五、案例三六、安装 Tesseract1、安装步骤2、配置环境3、使用 Python 识别图片信息 七、案例四 一、安装字体软件 FontCreator 点击下载字体软件 FontCreator 安装包 1、同意协议&#xff0c;点击…

QT--day5

注册 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QPushButton> #include<QLineEdit> #include<QLabel> #include <QMessageBox> #include<QString> #include<QSqlDatabase> …

python教程:使用gevent实现高并发并限制最大并发数

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 import time import gevent from gevent.pool import Pool from gevent import monkey # 一&#xff0c;定义最大并发数 p Pool(20) # 二&#xff0c;导入gevent…

Python —— excel文件操作(超详细)

背景 很多公司还是用excel去管理测试用例的&#xff0c;所以为了减少重复繁琐的导出导出工作&#xff0c;学会如何用代码操作excel表格很实用~ 1、读取excel文件基本步骤 1、操作excel的一些库 1、xlrd&#xff1a;读取库&#xff0c;xlwt&#xff1a;写入&#xff0c;现在…

win10 Baichuan2-7B-Chat-4bits 上部署 百川2-7B-对话模型-4bits量化版

搞了两天才搞清楚跑通 好难呢,个人电脑 win10 ,6GB显存 个人感觉 生成速度很慢,数学能力不怎么行 没有ChatGLM2-6B 强,逻辑还行, 要求: 我的部署流程 1.下载模型 ,下载所有文件 然后 放到新建的model目录 https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat-4bits/tr…

力扣刷题-数组-二分查找总结

前言 二分查找的使用前提/一般何时想到使用二分查找&#xff1a;数组为有序数组、数组中重复元素&#xff08;因为一旦有重复元素&#xff0c;使用二分查找法返回的元素下标可能不是唯一的&#xff09; 二分查找的关键 / 不容易写混乱的关键 / 谨记的不变量&#xff1a;区间定…

【大数据之Kafka】十六、Kafka集成外部系统之集成Flume

Flume 是一个在大数据开发中非常常用的组件。可以用于 Kafka 的生产者&#xff0c;也可以用于 Kafka 的消费者。 Flume安装和部署&#xff1a;https://blog.csdn.net/qq_18625571/article/details/131678589?spm1001.2014.3001.5501 1 Flume生产者 &#xff08;1&#xff09…

绿色科技:可持续发展的创新解决方案

标题绿色科技&#xff1a;可持续发展的创新解决方案 摘要引言绿色能源创新1. 太阳能和风能2. 储能技术 可再生资源管理3. 智能农业4. 循环经济 智能城市的未来5. 智能交通6. 城市感知 可持续生活方式7. 可持续建筑8. 智能家居 总结参考资料 博主 默语带您 Go to New World. ✍ …

短视频矩阵系统,短视频矩阵源码技术开发

开发短视频矩阵系统的源码需要以下步骤&#xff1a; 确定系统需求&#xff1a;根据客户的需求&#xff0c;确定系统的功能和特点&#xff0c;例如用户注册登录、视频上传、视频浏览、评论点赞等。 设计系统架构&#xff1a;根据系统需求&#xff0c;设计系统的整体架构&#x…

用户与权限管理

文章目录 用户与权限管理1. 用户管理1.1 MYSQL用户1.2 登录MySQL服务器1.3 创建用户1.4 修改用户1.5 删除用户1.6 修改密码1. 修改当前用户密码2. 修改其他用户密码 1.7 MYSQL8密码管理 2. 权限管理2.1 权限列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限 3. 权限…

C语言文件的相关操作

C语言中文件的相关操作 文件的打开 使用文件的打开函数需要引入这个头文件&#xff1a;#include <fcntl.h> open函数 int open(char const *pathname, int flags, mode_t mode) 功能&#xff1a;打开已有的文件或者创建新文件参数 pathname&#xff1a;文件路径名&…

IDEA开发工具技巧

1.1 IDEA相关插件 idea插件下载地址&#xff1a;https://plugins.jetbrains.com/ 开发必装插件&#xff1a; &#xff08;1&#xff09; 快速查找api接口 RestfulTool 插件&#xff0c;推荐指数⭐⭐⭐⭐⭐ [RestfulTool搜索插件使用详解](https://blog.csdn.net/weixin_450147…

java面向对象(九)

文章目录 一、abstract的应用举例二、接口的使用1.概念2.代码案例 三、try-catch-finally使用步骤1.注意点2.finally注意点 四、异常处理的方式二&#xff1a;throws 异常类型1.如图所示&#xff1a;2.代码如下&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0…

如何通过一键导出导入数据实现批量重命名文件名称

在日常办公中&#xff0c;我们经常需要对大量的文件进行重命名&#xff0c;以便更好地管理和查找文件。而且&#xff0c;有时候我们还需要将文件名称翻译成其他语言&#xff0c;以适应不同的工作需求。如何高效地完成这项任务呢&#xff1f;接下来&#xff0c;我将介绍一种方法…

How AI can revolutionise science AI如何彻底改变科学 | 经济学人20230916版双语精翻

本期重磅推荐&#xff1a;2023年9月16日《经济学人》封面文章双语精读&#xff1a;How AI can revolutionise science&#xff08;《AI将如何彻底改变科学》&#xff09; How AI can revolutionise science AI将如何彻底改变科学 The technology is being applied in many fiel…

基于Yolov8的工业端面小目标计数检测(1)

1.端面小目标计数数据集介绍 工业端面小目标计数类别:一类,类别名object 数据集大小:训练集864张,验证集98张 缺陷特点:小目标计数,检测难度大,如下图所示; 1.1 小目标定义 1)以物体检测领域的通用数据集COCO物体定义为例,小目标是指小于3232个像素点(中物体是指…

SSM - Springboot - MyBatis-Plus 全栈体系(十二)

第二章 SpringFramework 六、Spring 声明式事务 1. 声明式事务概念 1. 编程式事务 编程式事务是指手动编写程序来管理事务&#xff0c;即通过编写代码的方式直接控制事务的提交和回滚。在 Java 中&#xff0c;通常使用事务管理器(如 Spring 中的 PlatformTransactionManage…

使用注解方式和XML配置方式完成AOP编程

第一种方式:基于注解 beanx10.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http:/…

Vue中如何封装组件,如何进行跨组件通信

封装组件和跨组件通信是Vue.js中非常重要的概念&#xff0c;它们有助于构建模块化、可维护和可扩展的应用程序。本文将深入讨论如何在Vue中封装组件以及如何实现跨组件通信&#xff0c;同时提供示例代码来帮助您更好地理解这些概念。 第一部分&#xff1a;Vue组件的封装 在V…

负载均衡在线oj

1.项目源码&#x1f339;load-balanced-online-oj fortianyang/project - 码云 - 开源中国 (gitee.com) 2.相关技术⭐ ⭕C STL 标准库 ⭕Boost 准标准库(字符串切割) ⭕cpp-httplib 第三方开源网络库 ⭕ctemplate 第三方开源前端网页渲染库 ⭕jsoncpp 第三方开源序列化、…