23062QTday5

news2024/11/25 21:28:50

完成登录界面的注册功能

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QApplication>
#include <iostream>
#include <QMessageBox>
#include <QtDebug>
#include <QIcon>
#include<QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <string.h>
#include <QFileDialog>
#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();
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void btn2_clicked();
    void btn1_clicked();
    void btn3_clicked();
private:
    Ui::Widget *ui;
    QPushButton *btn1;
    QPushButton *btn2;
    QPushButton *btn3;

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

源文件:

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置固定尺寸
    this->setFixedSize(640,480);
    //给程序框重命名并添加图片
    this->setWindowTitle("Widget");
    this->setWindowIcon(QIcon(":/C:/Users/LENOVO/Desktop/icon/wodepeizhenshi.png"));

    //设置登录按钮
   btn1=new QPushButton(QIcon(":/C:/Users/LENOVO/Desktop/icon/login.png"),"登录",this);
   btn1->setParent(this);
   btn1->resize(100,50);
   btn1->move(220,400);
   //设置注册按钮
  btn3=new QPushButton("注册",this);
  btn3->setParent(this);
  btn3->resize(100,50);
  btn3->move(btn1->x()-120,btn1->y());


    //设置取消按钮
   btn2=new QPushButton(QIcon(":/C:/Users/LENOVO/Desktop/icon/cancel.png"),"取消",this);
   btn2->setParent(this);
   btn2->resize(btn1->size());
   btn2->move(btn1->x()+120,btn1->y());

   //添加账号图片
   QLabel *lab1=new QLabel(this);
   lab1->setPixmap(QPixmap(":/C:/Users/LENOVO/Desktop/icon/userName.jpg"));
   lab1->setScaledContents(true);
   lab1->resize(50,50);
   lab1->move(80,250);
   //添加密码图片
   QLabel *lab2=new QLabel(this);
   lab2->setPixmap(QPixmap(":/C:/Users/LENOVO/Desktop/icon/passwd.jpg"));
   lab2->setScaledContents(true);
   lab2->resize(50,50);
   lab2->move(lab1->x(),lab1->y()+60);
   //添加账号文本框
   edit1=new QLineEdit(this);
   edit1->resize(400,50);
   edit1->move(lab1->x()+60,lab1->y());
   edit1->setMaxLength(11);
   edit1->setPlaceholderText("账号/手机/邮箱");
   //添加密码文本框
   edit2=new QLineEdit(this);
   edit2->resize(400,50);
   edit2->move(lab2->x()+60,lab2->y());
   edit2->setEchoMode(QLineEdit::Password);
   edit2->setMaxLength(11);

    //添加顶层图片
   QLabel* lab3=new QLabel(this);
   lab3->setPixmap(QPixmap(":/C:/Users/LENOVO/Desktop/icon/logo.png"));
   lab3->setScaledContents(true);
   lab3->resize(640,220);
   //判断自己的数据库对象中,是否包含了要处理的数据库,如果没有包含则添加一个数据库,如果包含了,就可以打开了
   if(!db.contains("mydata.db"))
   {
       db = QSqlDatabase::addDatabase("QSQLITE");

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

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

   //需要使用sql语句进行创建表的操作
   //准备sql语句
   QString sql = "create table if not exists user_reg("           //创建表
                 "user varchar(10) primary key,"                   //用户
                 "key varchar(10))";                           //密码

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

   if(!querry.exec(sql))
   {
       QMessageBox::information(this, "失败", "创建表失败");
       return;
   }
   //判断账户密码

   connect(btn1, &QPushButton::clicked, this, &Widget::btn1_clicked);
   connect(btn2, &QPushButton::clicked, this, &Widget::btn2_clicked);
   connect(btn3, &QPushButton::clicked, this, &Widget::btn3_clicked);
}

Widget::~Widget()
{
    delete ui;
}
//注册槽函数
void Widget::btn3_clicked()
{
    //获取ui界面中要录入的数据
    QString user =edit1->text();
    QString key = edit2->text();


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

    //准备sql语句
    QString sql = QString("insert into user_reg(user,key) "
                  "values('%1', '%2')").arg(user).arg(key);

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

//登录槽函数
void Widget::btn1_clicked()
{
    //获取ui界面中要登录的数据
    QString user =edit1->text();
    QString key = edit2->text();
    int flag=0;
    //准备sql语句
    QString sql = QString("select * from user_reg where user=='%1' and key=='%2';").arg(user).arg(key);
    //准备语句执行者
    QSqlQuery querry;
    querry.exec(sql);
    while(querry.next())
    {
        flag=1;
    }

    if(!flag)
    {
        QMessageBox box(QMessageBox::Critical,
                        "出错",
                        "账号密码不匹配,是否重新登录",
                        QMessageBox::Ok | QMessageBox::Cancel,
                        this);

        int ret=box.exec();

        if(ret==QMessageBox::Ok)
        {
               edit2->clear();
        }else
        {
            this->close();
        }
    }
    else
    {
        //信息对话框
        QMessageBox box(QMessageBox::Information,
                        "信息对话框",
                        "登录成功",
                        QMessageBox::Yes,
                        this);
        box.setButtonText(QMessageBox::Yes,"ok");
        int ret=box.exec();

        if(ret==QMessageBox::Yes)
        {
            this->close();
        }
    }
}
//取消槽函数
void Widget::btn2_clicked()
{
        QMessageBox box(QMessageBox::Question,
                        "问题对话框",
                        "是否确定要退出登录",
                        QMessageBox::Yes | QMessageBox::No,
                        this);
        int ret=box.exec();

        if(ret==QMessageBox::Yes)
        {
               this->close();
        }
}

测试文件:

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

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

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

相关文章

Leetcode—— 20.有效的括号

20. 有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭…

【LeetCode-中等题】 222. 完全二叉树的节点个数

文章目录 题目方法一&#xff1a;把该题当做一个普通的二叉树来做&#xff08;任何遍历都可以&#xff09;方法二&#xff1a;利用完全二叉树的性质来做 题目 方法一&#xff1a;把该题当做一个普通的二叉树来做&#xff08;任何遍历都可以&#xff09; 例如&#xff1a;二叉树…

如何选择一只股票,待完善。

目录 ROE(盈利能力)增长率(成长能力)收现比(营收质量)总资产周转率(经营能力)增长率(成长能力)商誉净资产比(排雷)流动比率(排雷) ROE(盈利能力) 什么是ROE? ROE 全名叫 Return of Equity&#xff0c;翻成中文叫“股东回报率”&#xff0c;也叫"净资产收益率"。 …

token登录的实现

token登录的实现 我这种token只是简单的实现token&#xff0c;就是后端利用UUID 生成简单随机码&#xff0c;利用随机码作为在Redis中的键&#xff0c;然后存储的用户信息作为值&#xff0c;在每次合理请求的时候对token的有效时间进行刷新&#xff08;利用拦截器&#xff09;&…

常见的文件格式

一、C:\fakepath\新建文本文档.txt [object String] 实现方式&#xff1a; <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…

js 数组对象转为 key对应的数组

1、将要转换的格式 2、 转换后格式 3、代码处理 可以使用forEach循环遍历原始数组&#xff0c;并将每个对象的属性值分别存储在一个新的对象中。然后&#xff0c;使用Object.values()方法获取这些属性值的数组。 console.log(result--, result);let dealRes {};result.forEac…

10.12广州见 | 第十六届智慧城市大会报名通道全面开启

第十六届中国智慧城市大会 将于10月12日至13日 在广州举办 智慧城市是数字中国、智慧社会的核心载体&#xff0c;是数字时代城市发展的高级形态。由中国服务贸易协会、中国测绘学会、中国遥感委员会主办的第十六届中国智慧城市大会&#xff0c;将以“数实融合开放创新智引未…

“降本”是关键,FCU1104打造低成本工商业储能EMS

在不久前举行的EESA中国国际储能展上&#xff0c;“工商业储能”成为了热度最高的话题之一&#xff0c;几乎每家展出工商业储能系统的展商都收获了大量观众的驻足围观&#xff0c;热度非凡。究竟是怎样的原因让工商业储能如此瞩目呢&#xff1f; 通过与多家储能厂家沟通并查阅…

群晖管家+内网穿透实现公网远程访问本地黑群晖

白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01; 文章目录 白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01;1.使用环境要求&#xff1a;2.下载安装群晖管家app3.随机地址登陆群晖管家app4.固定地址登陆群晖管家app 自己组装nas的白嫖怪们虽然也可以通…

IP转地理位置:探讨技术与应用

IP地址是互联网上设备的唯一标识符&#xff0c;而将IP地址转换为地理位置信息是网络管理、安全监控和市场定位等领域中的一项重要任务。本文将深入探讨IP转地理位置的技术原理和各种应用场景。 IP地址与地理位置 IP地址&#xff08;Internet Protocol Address&#xff09;是一…

一、八大排序(sort)

文章目录 一、时间复杂度&#xff08;一&#xff09;定义&#xff1a;常数操作 二、空间复杂度&#xff08;一&#xff09;定义&#xff1a; 三、排序&#xff08;一&#xff09;选择排序1.定义2.代码3.特性 &#xff08;二&#xff09;冒泡排序1.定义2.代码3.特性 &#xff08…

樱花(筛素数+约数)

题目 给定一个整数 n&#xff0c;求有多少正整数数对 (x,y) 满足 1/x1/y1/n!。 输入格式 一个整数 n。 输出格式 一个整数&#xff0c;表示满足条件的数对数量。 答案对 1e97取模。 数据范围 1≤n≤106 输入样例&#xff1a; 2输出样例&#xff1a; 3样例解释 共有…

中华崛起,科技强国!这三款充满科技风的科技模板,一起来探索吧

最近是不是都被华为mate60和苹果15刷屏了啊 &#xff0c;在我们的生活中&#xff0c;科技有着千变万化的面貌。它让我们的世界变得越来越小&#xff0c;让我们的生活越来越便捷。它使我们的梦想成为现实&#xff0c;使我们的思想得以落地。它打开了新的视野&#xff0c;为我们提…

java面向对象(八)

文章目录 一、abstract关键字的使用1.概念2. abstract修饰类:抽象类3.abstract修饰方法&#xff0c;抽象方法4.abstract使用上的注意点&#xff1a;5.抽象类的匿名子类 二、计算一段代码执行所花费的时间三、接口的使用1.接口的使用2.定义接口中的成员3.代码demo4.Java类可以实…

LabVIEW应用开发——前面板和程序框图

上篇我们讲述了LabVIEW的安装并且新建了一个VI程序成功运行&#xff0c;这篇我们详细了解界面上一些工具、属性和层次结构。 LabVIEW安装 我们双击打开上次创建的.vi文件。 这时候我们发现只有前面板&#xff0c;程序框图界面不见了&#xff0c;我们需要使用CtrlE或者在Windows…

点进来看看ChatBase替代品在提高工作效率方面有什么优势

ChatBase是帮助企业分析和改善其对话式 AI 体验的一个很好的定制聊天机器人平台。但它也有一些局限性&#xff0c;像其对对话分析的关注范围狭窄&#xff0c;而且还依赖手动标记和标记对话进行分析&#xff0c;可能会阻碍提高工作的效率。那有什么比较好的平台能够替代Chatbase…

解决 VMware Network Adapter VMnet1 IP 地址冲突导致无法打开路由器管理页面

问题表现 运行 ipconfig&#xff1a; 以太网适配器 以太网:连接特定的 DNS 后缀 . . . . . . . : lanIPv4 地址 . . . . . . . . . . . . : 192.168.1.226子网掩码 . . . . . . . . . . . . : 255.255.255.0默认网关. . . . . . . . . . . . . : 192.168.1.1以太网适配器 VM…

IM6ULL学习第18章Linux 系统对中断的处理

栈 什么是栈 栈是一段内存空间。ARM处理器程序的运行过程 ARM芯片属于精简指令集(RISC&#xff1a;Reduced Instruction Set Computing) 特点&#xff1a; 1、对内存只有读和写两种指令&#xff0c; 2、所有的数据运算都是在CPU内部完成的。举例实现aab; CPU 先在内存中读…

竞赛选题 基于深度学习的人脸识别系统

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

相比SiteGPT,用HelpLook创建Chatbot有哪些优势?

在当今快节奏的数字时代&#xff0c;很多企业都在不断寻找新的方法来改善客户支持和简化运营。一种广受欢迎的解决方案是使用AI问答机器人&#xff08;Chatbot&#xff09;。聊天机器人凭借其理解自然语言查询和实时响应的能力&#xff0c;已成为各行业企业不可或缺的工具。 S…