day49:QT day2,信号与槽、对话框

2023-09-18 20:48:25

一、完善登录框

点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。

如果账号和密码匹配,则弹出信息对话框,给出提示信息为“登录成功”,给出一个按钮ok,点击ok后,关闭整个登录界面,跳转到其他界面

点击取消按钮后,弹出问题对话框,询问是否确定要退出登录,给出两个按钮,yes|no,点击yes,则直接关闭整个登录界面,如果点击no则进行进行登录

要求:消息对话框,对象版和静态成员函数版至少各实现一个

第二个界面,second.h:

#ifndef SECOND_H
#define SECOND_H

#include <QWidget>

namespace Ui {
class Second;
}

class Second : public QWidget
{
    Q_OBJECT

public:
    explicit Second(QWidget *parent = nullptr);
    ~Second();

public slots:
    void jump_slot();   //跳转槽,用来接收从widget发送的信号

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();
}

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QMessageBox>
#include "second.h"

class Widget : public QWidget
{
    Q_OBJECT

private:
    QLabel *lab1;   //背景
    QLabel *lab2;   //用户图标
    QLabel *lab3;   //密码图标
    QLineEdit *edit1;   //用户名/手机/邮箱
    QLineEdit *edit2;   //密码
    QPushButton *btn1;  //登录
    QPushButton *btn2;  //退出
    QMessageBox errbox; //错误对话框定义

    Second* s1;     //第二个界面定义
signals:
    void jump();    //发送信号与第二个界面second槽反应

public slots:
    void login_slot();  //登录按钮点击事件接收槽
    void cancel_slot();  //取消按钮点击事件接受槽

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
};
#endif // WIDGET_H

widget.cpp:

#include "widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setFixedSize(500,500);
    this->setWindowTitle("hqyj login...");
    this->setWindowIcon(QIcon("D:\\qianrushi\\icon\\wodepeizhenshi.png"));

    //实例化一个标签,给定初始文本内容并指定父组件
    lab1=new QLabel(this);

    lab1->resize(500,200);
    lab1->move(0,0);
     lab1->setPixmap(QPixmap("D:\\qianrushi\\icon\\logo.png"));
     lab1->setScaledContents(true);
    //lab1->setGeometry(0,0,500,200);


    lab2=new QLabel(this);
    lab2->resize(30,30);
    lab2->move(80,250);
    lab2->setPixmap(QPixmap("D:\\qianrushi\\icon\\userName.jpg"));
    lab2->setScaledContents(true);



    edit1=new QLineEdit(this);
    edit1->setGeometry(lab2->x()+50,lab2->y()-10,300,50);
    edit1->setPlaceholderText("hqyj账号/手机/邮箱");


    lab3=new QLabel(this);
    lab3->setPixmap(QPixmap("D:\\qianrushi\\icon\\passwd.jpg"));
    lab3->setGeometry(lab2->x(),lab2->y()+50,30,30);
    lab3->setScaledContents(true);

    edit2=new QLineEdit(this);
    edit2->setGeometry(lab3->x()+50,lab3->y()-10,300,50);
    edit2->setPlaceholderText("密码");
    edit2->setEchoMode(QLineEdit::Password);

    btn1=new QPushButton(QIcon("D:\\qianrushi\\icon\\login.png"),"登录",this);
    btn1->resize(100,40);
    btn1->move(lab3->x()+100,lab3->y()+80);

    btn2=new QPushButton(QIcon("D:\\qianrushi\\icon\\cancel.png"),"退出",this);
    btn2->resize(100,40);
    btn2->move(btn1->x()+150,btn1->y());

    //给第二个界面申请空间
    s1 = new Second;
    //连接弹窗的信号与槽
    connect(this,&Widget::jump,s1,&Second::jump_slot);

    //连接登录的信号与槽
    connect(btn1,&QPushButton::clicked,this,&Widget::login_slot);
    //连接取消的信号与槽
    connect(btn2,&QPushButton::clicked,this,&Widget::cancel_slot);
}

Widget::~Widget()
{
}

void Widget::login_slot()
{
    if(edit1->text()!="admin" || edit2->text()!="123456")
    {
        //登录失败,弹出错误对话框
        errbox.setText("账号密码不匹配,是否重新登录");
        errbox.setWindowTitle("错误对话框");
        errbox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
        errbox.setDefaultButton(QMessageBox::Yes);
        int ret1=errbox.exec();
        if(ret1==QMessageBox::Yes)
        {
            //同意,隐藏错误对话框,清空账号密码
            errbox.hide();
            edit1->clear();
            edit2->clear();
        }else if(ret1==QMessageBox::Cancel)
        {
            //取消,关闭错误对话框
            errbox.close();
        }
    }else{
        int ret2=QMessageBox::information(this,"信息对话框","登录成功",QMessageBox::Ok,QMessageBox::Ok);
        if(ret2 == QMessageBox::Ok)
        {
            //同意登录,跳转
            this->close();
            emit jump();
        }
    }
}

void Widget::cancel_slot()
{
    QMessageBox quesbox(QMessageBox::Question,
                        "问题对话框",
                        "确定退出?",
                        QMessageBox::Yes|QMessageBox::No,
                        this);
    //取消,弹出问题对话框
    int ret3=quesbox.exec();
    if(ret3 == QMessageBox::Yes)
    {
        //同意退出,退出程序
        quesbox.close();
        this->close();
    }else if(ret3 == QMessageBox::No)
    {
        //取消,继续登录
        quesbox.hide();
    }
}

main.cpp:

#include "widget.h"

#include <QApplication>

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

二、思维导图:有道云笔记

更多推荐

《Linux高性能服务器编程》--TCP/IP协议族

目录1--TCP/IP协议族2--数据链路层3--网络层4--传输层5--应用层6--封装和分用7--ARP协议的工作原理1--TCP/IP协议族TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层;2--数据链路层数据链路层两个常用协议:ARP协议(地址解析协议)和RARP协议(逆地

分析数组,结构体在反汇编中存储

本文会在IDA中分析数组,结构体在内存中的存储目录IDA分析数组存储IDA分析结构体存储传递参数的方式IDA分析数组存储测试代码如下:/************************************************************************//*@Author:玄都大法师/*@D

Gateway网关

网关GateWay官方文档:https://docs.spring.io/spring-cloud-gateway/docs/3.1.2/reference/html/#gateway-how-it-works核心概念路由:网关的核心数据结构,定义了网关如何处理请求.一条路由信息包含路由的唯一标识ID,目的地URI,一

驱动开发,基于gpio子系统编写LED灯的驱动,亮灭控制

1.gpio子系统介绍一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动,我们当前只需要调用对应的厂商驱动即可完成硬件的控制。而linux内核源码中的gpio厂商驱动有很多,这里linux内核对厂商驱动做了一些封装,提供了一系列的API,我们在自己编写的设备驱动中只需要调用这些API即可访问对应

redis 集群(cluster)

1.前言我们知道,在Web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(主存分离、快速容灾技术)还需要考虑数据容量的扩展,数据安全不会丢失等。在Redis中

大数据时代下统计数据质量的影响因素

统计工作是为政府提供国民经济运行信息的重要手段,将大数据应用于统计工作是社会发展饿必然趋势。一、内涵在数字化时代和数字经济的飞速发展,“数据”已经被认定为一种新的生产要素,并且发挥着重要作用。数据质量的高低直接影响数据价值的高低。数据质量,是指在业务环境下,数据符合数据消费者的使用者目的,能够满足业务场景具体需求的程度

132.【MySQL_进阶】

MySQL_进阶(一)、存储引擎1.MySQL体系结构(1).连接层(2).服务层(3).引擎层(4).存储层2.存储引擎简介(1).查看某张表的数据引擎(2).展示此版本支持的所有存储引擎(3).创建表my_myisam,并指定MyIASM存储引擎(4).存储引擎示列3.存储引擎_Innodb(1).Innodb介绍

赛宁党支部赴延安开展革命旧址学习主题党日活动

为深入学习贯彻新时代中国特色社会主义思想和中共二十大精神,不断提升党支部成员综合素质和业务能力,2023年9月,赛宁公司党支部组织北京、南京、广州等三地部分党员及入党积极分子开展了“革命旧址学习”主题党日活动,深入寻访延安革命纪念馆、杨家岭、枣园革命旧址等红色基地,重温入党誓词,感悟辉煌历史,凝聚前进力量。“走进革命纪

K8S-Pod 进阶

Pod进阶一、资源限制(业务cpu内存)1.定义2.Pod和容器的资源请求和限制3.CPU资源单位4.内存资源单位5.示例二、健康检查:又称为探针(Probe)1.定义2.探针的三种规则:3.Probe支持三种检查方法4.示例三、扩展1.pod的状态2.Container生命周期四、总结1.资源限制2.Pod容器探针3

JS响应替换|解决谷歌验证码混淆js还原替换后的跨域问题

关注它,不迷路。本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!1.目标地址夜幕爬虫安全论坛的登录页面有个谷歌验证码:其地址是:https://bbs.nightteam.cn/member.php?mod=logging&action=login它的混淆js地

【Xilinx】基于MPSoC的OpenAMP实现(一)

【Xilinx】基于MPSoC的OpenAMP实现(一)一、开发环境1、开发思路2、下载官方bsp包二、编译Linux1、配置petalinux环境变量2、创建工程3、进入目录4、设置缓存目录(重点:可离线编译,加快编译速度)5、配置u-boot6、配置内核6.1增加内核选项(重点:没有正确选择会导致运行时各种奇怪的报

热文推荐