QT:使用多窗口做一个登录注册小项目(登录窗口、登录结果窗口、注册窗口)

news2024/11/24 4:58:37

widget.h(登录窗口)

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QCheckBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <Qmap>            //模板类

class Widget : public QWidget
{
    Q_OBJECT   //使用信号与槽函数

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    
signals:
    void enter_login_result(bool result);  //信号:给登录结果窗口发送登录结果
    void enter_register();      //信号:点击注册按钮,隐藏登录窗口

private slots:
    void le_input_handler();   //槽函数:激活登录按钮
    void re_login_handler();   //槽函数:重新登录

private:
    QLabel *lb_account,*lb_passwd;   //标签:账号、密码
    QLineEdit *le_account,*le_passwd;  //行编辑器:账号、密码
    QCheckBox *cb_remember,*cb_show_passwd;  //复选框:记住密码、显示密码
    QPushButton *pb_login,*pb_register;  //按钮:登录、注册

};


#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>

QMap<QString,QString> a_p_map;  //容器

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(330,220);
    setWindowTitle("登录窗口");
    setFont(QFont("Times",10,QFont::Bold));

    lb_account = new QLabel("账号:",this);   //创建标签
    le_account = new QLineEdit(this);        //创建行编辑器
    connect(le_account,&QLineEdit::textChanged,this,&Widget::le_input_handler);  //账号文本内容改变触发槽函数

    QHBoxLayout *hbox1 = new QHBoxLayout();  //创建水平布局管理器
    hbox1->addWidget(lb_account);
    hbox1->addWidget(le_account);

    lb_passwd = new QLabel("密码:",this);              //创建标签
    le_passwd = new QLineEdit(this);                   //创建行编辑器
    le_passwd->setEchoMode(QLineEdit::Password);       //设置密码回响形式
    connect(le_passwd,&QLineEdit::textChanged,this,&Widget::le_input_handler);  //密码文本内容改变触发槽函数

    QHBoxLayout *hbox2 = new QHBoxLayout();          //创建水平布局管理器
    hbox2->addWidget(lb_passwd);
    hbox2->addWidget(le_passwd);

    cb_remember = new QCheckBox("记住密码",this);     //复选框

    cb_show_passwd = new QCheckBox("显示密码",this);  //复选框
    connect(cb_show_passwd,&QCheckBox::clicked,[=](){    //勾选显示密码复选框即显示密码
        if(cb_show_passwd->isChecked())
        {
        le_passwd->setEchoMode(QLineEdit::Normal);
        }
        else
        {
             le_passwd->setEchoMode(QLineEdit::Password);
        }
    });

    QHBoxLayout *hbox3 = new QHBoxLayout();    //创建水平布局管理器
    hbox3->addWidget(cb_remember);
    hbox3->addWidget(cb_show_passwd);

    pb_login = new QPushButton("登录",this);         //创建登录按钮
    pb_login->setEnabled(false);                    //不激活功能
    connect(pb_login,&QPushButton::clicked,[=](){   //点击登录按钮
        bool result = false;
        if(a_p_map.contains(le_account->text()) &&              //检测容器中是否包含行编辑器中输入的账号
           a_p_map.value(le_account->text()) == le_passwd->text())     //包含则获取对应的密码,并与行编辑器中输入的密码对比是否相等
        {
            result = true;
                qDebug()<<"密码正确";
        }
        else
        {
                qDebug()<<"密码错误";
        }
        hide();                                   //是否正确都将登录窗口隐藏

        emit enter_login_result(result);         //发送登录结果给登录结果窗口
    });

    pb_register = new QPushButton("注册",this);        //创建注册按钮

    QHBoxLayout *hbox4 = new QHBoxLayout();      //创建水平布局管理器
    hbox4->addWidget(pb_login);
    hbox4->addWidget(pb_register);

    QVBoxLayout *vbox = new QVBoxLayout();       //创建垂直布局管理器
    vbox->addLayout(hbox1);
    vbox->addLayout(hbox2);
    vbox->addLayout(hbox3);
    vbox->addLayout(hbox4);

    setLayout(vbox);                            //设置整个布局
    a_p_map.insert("admin","admin");           //容器中插入账号、密码
    qDebug()<<a_p_map;

    connect(pb_register,&QPushButton::clicked,[=](){     //点击注册按钮
        hide();                                          //隐藏登录窗口
        emit enter_register();                           //发送信号
    });

}

void Widget::le_input_handler()                 //槽函数:是否激活登录按钮
{
    if(le_account->text().isEmpty() ||         //账号或密码有一个为空则继续不激活
       le_passwd->text().isEmpty())
    {
        pb_login->setEnabled(false);
    }
    else                                       //激活
    {
        pb_login->setEnabled(true);
    }
}

void Widget::re_login_handler()               //槽函数:显示登录窗口
{
    show();
}

Widget::~Widget()
{

}

loginresult.h(登录结果窗口)

#ifndef LOGINRESULT_H
#define LOGINRESULT_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>

class LoginResult : public QWidget
{
    Q_OBJECT
public:
    explicit LoginResult(QWidget *parent = nullptr);

signals:  //信号只需要声明
    void re_login();
public slots:
    void enter_handler(bool result);  //槽函数:根据登录结果设置登录结果窗口
private:
    QLabel *lb;    //标签:登录结果
    QLineEdit *le;    //行编辑器
    QPushButton *pb_re_login,*pb_exit;  //2个按钮:重新登录、关闭
};

#endif // LOGINRESULT_H

loginresult.cpp

#include "loginresult.h"
#include <QHBoxLayout>
#include <QVBoxLayout>

LoginResult::LoginResult(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("登录结果窗口");
    setFixedSize(330,220);
    setFont(QFont("Times",10,QFont::Bold));

    lb = new QLabel("登录结果",this);              //创建标签

    le = new QLineEdit(this);                     //创建行编辑器
     le->setReadOnly(true);                       //设置为只读
    QHBoxLayout *hbox1 = new QHBoxLayout();       //创建水平布局管理器
    hbox1->addWidget(lb);
    hbox1->addWidget(le);

    pb_re_login = new QPushButton("重新登录",this);      //创建重新登录按钮
    connect(pb_re_login,&QPushButton::clicked,[=](){   //点击重新登录按钮
        hide();                                        //隐藏登录结果窗口
        emit re_login();                               //发送信号
    });

    pb_exit = new QPushButton("关闭",this);             //创建关闭按钮
    connect(pb_exit,&QPushButton::clicked,[=](){       //实现关闭功能
        close();
    });

    QHBoxLayout *hbox2 = new QHBoxLayout();            //创建水平布局管理器
    hbox2->addWidget(pb_re_login);
    hbox2->addWidget(pb_exit);

    QVBoxLayout *vbox = new QVBoxLayout();             //创建垂直布局管理器
    vbox->addLayout(hbox1);
    vbox->addLayout(hbox2);

    setLayout(vbox);       //设置整个布局

}

void LoginResult::enter_handler(bool result)         //槽函数:设置登录结果窗口
{
    if(result)                                       //为真
    {
        le->setText("登录成功");
        pb_re_login->hide();                         //隐藏重新登录按钮
    }
    else
    {
        le->setText("登录失败");
    }

    show();                //显示登录结果窗口
}

register.h(用户注册窗口)

#ifndef REGISTER_H
#define REGISTER_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <Qmap>

class Register : public QWidget
{
    Q_OBJECT
public:
    explicit Register(QWidget *parent = nullptr);

signals:
    void re_login();  //注册完成
public slots:
    void register_handler();  //槽函数:显示用户注册窗口
    void le_name_paswd_handler();  //激活注册按钮
private:
    QLabel *lb_title,*lb_name,*lb_passwd,*lb_re_passwd;
    QLineEdit *le_name,*le_passwd,*le_re_passwd;
    QPushButton *pb_register,*pb_exit;

};

#endif // REGISTER_H

register.cpp

#include "register.h"
#include <QHBoxLayout>    //水平布局
#include <QVBoxLayout>    //垂直布局
#include <QMap>
#include <QDebug>

extern QMap<QString,QString> a_p_map;

Register::Register(QWidget *parent) : QWidget(parent)
{
     setWindowTitle("用户注册窗口");
     setFixedSize(330,220);

     lb_title = new QLabel("请输入您的注册信息",this);         //创建标签
     QFont font("Times",16,QFont::Bold);
     lb_title->setFont(font);                               //设置标签字体大小
     lb_title->setAlignment(Qt::AlignCenter);               //居中对齐

     lb_name = new QLabel("用户名:",this);                   //创建标签
     le_name = new QLineEdit(this);                         //创建行编辑器

     QHBoxLayout *hbox1 = new QHBoxLayout();                //创建水平布局管理器
     hbox1->addWidget(lb_name);
     hbox1->addWidget(le_name);

     lb_passwd = new QLabel("请输入密码:",this);              //创建标签
     le_passwd = new QLineEdit(this);                       //创建行编辑器
     le_passwd->setEchoMode(QLineEdit::Password);           //设置密码回响模式

     QHBoxLayout *hbox2 = new QHBoxLayout();                //创建水平布局管理器
     hbox2->addWidget(lb_passwd);
     hbox2->addWidget(le_passwd);

     lb_re_passwd = new QLabel("请确认密码:",this);           //创建标签
     le_re_passwd = new QLineEdit(this);                    //创建行编辑器
     le_re_passwd->setEchoMode(QLineEdit::Password);        //设置密码回响模式

     QHBoxLayout *hbox3 = new QHBoxLayout();                //创建水平布局管理器
     hbox3->addWidget(lb_re_passwd);
     hbox3->addWidget(le_re_passwd);

     pb_register = new QPushButton("注册",this);             //创建按钮
     pb_register->setEnabled(false);                        //先不激活
     pb_exit = new QPushButton("关闭",this);                 //创建按钮
     connect(pb_exit,&QPushButton::clicked,[=](){           //实现关闭功能
         close();
     });

     QHBoxLayout *hbox4 = new QHBoxLayout();                //创建水平布局管理器
     hbox4->addWidget(pb_register);
     hbox4->addWidget(pb_exit);

     QVBoxLayout *vbox = new QVBoxLayout();                 //创建垂直布局管理器
     vbox->addWidget(lb_title);
     vbox->addLayout(hbox1);
     vbox->addLayout(hbox2);
     vbox->addLayout(hbox3);
     vbox->addLayout(hbox4);

     setLayout(vbox);   //设置总布局

     //用于激活注册按钮
     connect(le_name,&QLineEdit::textChanged,this,&Register::le_name_paswd_handler);
     connect(le_passwd,&QLineEdit::textChanged,this,&Register::le_name_paswd_handler);
     connect(le_re_passwd,&QLineEdit::textChanged,this,&Register::le_name_paswd_handler);

     connect(pb_register,&QPushButton::clicked,[=](){         //完成注册功能
         if(a_p_map.contains(le_name->text()))
         {
             qDebug()<<"用户名已经存在";
             return;
         }
         if(le_passwd->text() != le_re_passwd->text())
         {
             qDebug()<<"两次输入的密码不一致";
             return;
         }
         a_p_map.insert(le_name->text(),le_passwd->text());    //插入注册信息
         qDebug()<<a_p_map;                                   //打印所有注册信息
         hide();                                              //注册成功后隐藏用户注册窗口
         emit re_login();                                     //发送信号给登录窗口
     });
}

void Register::register_handler()                            //槽函数:注册
{
    show();                                                  //显示用户注册窗口
}

void Register::le_name_paswd_handler()  //激活注册按钮
{
    if(le_name->text().isEmpty() ||
       le_passwd->text().isEmpty() ||
       le_re_passwd->text().isEmpty())
    {
        pb_register->setEnabled(false);
    }
    else
    {
        pb_register->setEnabled(true);
    }
}

结果

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

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

相关文章

7年阿里测试经验之谈 —— 用UI自动化测试实现元素定位

随着IT行业的发展&#xff0c;产品愈渐复杂&#xff0c;web端业务及流程更加繁琐&#xff0c;目前UI测试仅是针对单一页面&#xff0c;操作量大。为了满足多页面功能及流程的需求及节省工时&#xff0c;设计了这款UI 自动化测试程序。旨在提供接口&#xff0c;集成到蜗牛自动化…

软件测试:什么是敏捷测试?

1. 什么是敏捷测试 敏捷测试是一种在敏捷开发环境中进行软件测试的方法&#xff0c;不同于传统瀑布模型中的测试阶段&#xff0c;敏捷测试强调持续测试、快速反馈和合作开发。 敏捷测试与敏捷开发相辅相成&#xff0c;通过频繁的迭代和增量开发来提高软件的交付速度和质量。 …

C++QT day9

完善登录框 点击登录按钮后&#xff0c;判断账号&#xff08;admin&#xff09;和密码&#xff08;123456&#xff09;是否一致&#xff0c;如果匹配失败&#xff0c;则弹出错误对话框&#xff0c;文本内容“账号密码不匹配&#xff0c;是否重新登录”&#xff0c;给定两个按钮…

基于GPIO子系统编写LED灯驱动

驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/gpio.h> #include <linux/fs.h> #include <linux/io.h> #include <linux/device.h> #incl…

【Spring】IOC基本用法

&#x1f388;博客主页&#xff1a;&#x1f308;我的主页&#x1f308; &#x1f388;欢迎点赞 &#x1f44d; 收藏 &#x1f31f;留言 &#x1f4dd; 欢迎讨论&#xff01;&#x1f44f; &#x1f388;本文由 【泠青沼~】 原创&#xff0c;首发于 CSDN&#x1f6a9;&#x1f…

js自带的字体图标

let body document.querySelector(body)body.width 100%for (let i 1; i < 10000; i) {let str &#i;let sm str.big()let st document.createElement(span)st.innerHTML smst.style.fontSize 30pxbody.appendChild(st)} 结果如下

Vue2+Vue3基础入门到实战项目全套教程的学习笔记

内容的视频链接点击此处可进入 这套笔记是按照视频和视频笔记总结的笔记&#xff0c;主要是方便vue的学习或温习&#xff0c;基本抛弃css样式的添加&#xff0c;专注于vue的使用。 第一天 Vue 快速上手 Vue的概念 Vue 是一个用于 构建用户界面 的 渐进式 框架 创建实例 …

在线Excel转JSON工具

在线Excel转JSON工具 上传excel将数据转换成json格式

5-3 pytorch中的损失函数

一般来说&#xff0c;监督学习的目标函数由损失函数和正则化项组成。(Objective Loss Regularization) Pytorch中的损失函数一般在训练模型时候指定。 注意Pytorch中内置的损失函数的参数和tensorflow不同&#xff0c;是y_pred在前&#xff0c;y_true在后&#xff0c;而Tenso…

系统IO和标准IO

一.系统IO 系统 I/O&#xff08;Input/Output&#xff09;是计算机操作系统提供给应用程序的一种输入和输出方式。它通过系统调用&#xff08;系统内核提供的函数&#xff09;来实现数据的读取和写入。系统 I/O 可以用于与文件、设备&#xff08;例如磁盘驱动器、网络接口、串…

哪些情况可以使用自动化测试?

通常&#xff0c;软件测试的测试方式分为人工测试和自动化测试&#xff0c;人工测试是由测试人员编写并执行测试用例&#xff0c;然后观察测试结果与预期结果是否一致的过程;自动化测试是通过测试工具来代替或辅助人工去验证系统功能是否有问题的过程。 采用自动化测试需要满足…

blender怎么设置中文界面

你们知道Blender软件是什么吗&#xff1f;你知道blender怎么设置中文界面吗&#xff1f;Blender是个GNU的3D绘图软件&#xff0c;建模、算图、动画等功能都相当的完整&#xff0c;可以说已经具有了一般商业软件的规模。Blender大部分的功能都有热键&#xff0c;操作起来相当地轻…

Nano 编辑器中,怎样保存和退出

使用git 修改提交记录时&#xff0c;使用命令&#xff1a; git commit --amend 弹出了nano编辑器&#xff0c;第一次使用的时候不知道怎么保存退出&#xff0c;现在记录下&#xff1a; 1.修改完毕后使用Ctrl x,然后会弹出 点击Y后&#xff0c;界面会退回到如下 这时候点击E…

springboot和vue:四、web入门(静态资源访问+文件上传+拦截器)

静态资源访问 使用IDEA创建Spring Boot项目&#xff0c;会默认创建出classpath:/static/目录&#xff0c;静态资源一般放在这个目录下即可。如果默认的静态资源过滤策略不能满足开发需求&#xff0c;也可以自定义静态资源过滤策略。 在application.properties中定义过滤规则和…

数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo基于Selenium与Java。由于现在Selenium在自动化测试的统治地位&#xff0c;并且随着Selenium 4的即将发布&#xff0c;在未来很长的一段时间里…

【C#】XML的基础知识以及读取XML文件

最近在学读取文件 目录 介绍特点结构XML的语法规则XML 命名规则 C#操作XML新建读取第一种第二种第三种 读取属性 介绍 XML (可扩展标记语言&#xff0c;eXtensible Markup Language) 是一种标记语言&#xff0c;它被设计用来传输和存储数据。 特点 可扩展性&#xff1a;由于…

C++---异常处理

异常处理 异常处理try语句块和throw表达式异常的抛出和捕获异常的抛出和匹配原则 异常安全异常规范标准异常 异常处理 异常是指存在于运行时的反常行为&#xff0c;这些行为超出了函数正常功能的范围。当程序的某部分检测到一个他无法处理的问题时&#xff0c;需要用到异常处理…

港联证券:停牌后复牌股价怎么算?

股票停牌是指买卖所或证券公司暂停一只股票的买卖&#xff0c;并不再出现在股票商场上。停牌的原因或许是公司内部事务调整、财政审计、重大事件或公司被收购等。当一家公司的股票停牌时&#xff0c;这对持有该公司股票的投资者或许会带来一些影响。因而&#xff0c;了解停牌后…

最新医疗界AI资讯,远程评估帕金森病症状的AI工具问世

原创 | 文 BFT机器人 1、AI模型快速评估&#xff0c;自动生成评估报告 罗切斯特大学研究人员开发的一种人工智能工具可以帮助帕金森病患者在几分钟内远程评估其症状的严重程度。《npj数字医学》杂志上的一项研究介绍了这种新工具&#xff0c;它能让用户在网络摄像头前通过敲击…

如何验证高压放大器的性能好坏呢

验证高压放大器的性能好坏&#xff0c;就需要考虑一系列关键指标和测试方法。这些指标包括频率响应、增益、失真、输出功率、噪声以及稳定性等&#xff0c;使我们能够全面评估放大器的性能和质量。下面西安安泰电子将介绍如何验证高压放大器的性能&#xff0c;并针对不同指标提…