【0831作业】QTday2 加载资源文件、信号与槽机制(非常重要)、界面跳转

news2024/11/19 23:18:09

一、思维导图

二、今日面试题

三、今日知识回顾

1 信号与槽的连接

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QDebug>
#include<QPushButton>
#include<QTextToSpeech>//文本转语音类
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

signals:
    void my_signal();  //自定义信号函数

public slots:
    void my_slot();    //自定义的槽函数

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_btn2_clicked();

    void on_btn6_clicked();

private:
    Ui::Widget *ui;

    //自定义一个按钮
    QPushButton *btn3;

    //定义有一个播报员指针
    QTextToSpeech *speecher;


};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"

void fun()
{
    qDebug()<<"我是路过的";
}

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->my_slot();
    this->my_signal();

    //给播报员实例化空间
    speecher = new QTextToSpeech(this);

    //给btn3实例化空间
    this->btn3 = new QPushButton("按钮3",this);
    this->btn3->move(ui->btn2->x(),ui->btn2->y()+50);
    this->btn3->resize(ui->btn2->size());

    //使用qt4版本的连接,将按钮3发射的pressed信号与按钮1的槽函数进行连接(不友好的连接)(SIGNAL和SLOT是宏,只做替换、不做计算)
    connect(btn3,SIGNAL(pressed()),ui->btn1,SLOT(hide()));
    //参数1:信号的发射者,按钮3的指针
    //参数2:要发射的信号,是在按钮所在类中拥有的信号函数,需要使用SIGNAL宏函数进行转换
    //参数3:信号的接收者,ui界面上的按钮1指针
    //参数4:处理信号的槽函数,是信号接收者所在类中拥有的槽函数
    //注意:该连接方式是不友好的连接,(原因:即使宏函数中写错信号,编译器不报错,但是没有现象)

    //使用qt5版本的连接(友好的连接,写错信号时会立即报错),将ui界面上的btn4按钮发射的clicked信号,与当前界面的自定义的槽函数连接
    connect(ui->btn4,&QPushButton::clicked,this,&Widget::my_slot);

    //将ui界面上的按钮5,发射的clicked信号,连接到全局函数中
    connect(ui->btn5,&QPushButton::clicked,fun);

    //将ui界面上的按钮5发射的clicked信号,连接到lambda表达式中
    connect(ui->btn5,&QPushButton::clicked,[&](){
        //qDebug()<<"我是路人乙";
        //speecher->say(ui->btn1->text());
        speecher->say("我是路人乙");
    });


    //将当前界面的my_signal信号连接到自定义的槽函数中
    connect(this, &Widget::my_signal,[&](){
        speecher->say("已经成功断开按钮3和按钮4的连接");
    });

}

Widget::~Widget()
{
    delete ui;
}

//自定义的槽函数的实现
void Widget::my_slot()
{
    //qDebug()<<"hello a";
    static int num = 0;
    if(num % 2 == 0)
    {
        ui->btn2->setEnabled(false);
    }
    else
    {
        ui->btn2->setEnabled(true);
    }
    num++;
}

//该函数就是按钮2的clicked信号对应槽函数
void Widget::on_btn2_clicked()
{
    static int num = 0;
    if(num %3 == 0)
    {
        ui->btn2->setStyleSheet("background-color:red;");
    }
    else if(num %3 == 1)
    {
        ui->btn2->setStyleSheet("background-color:yellow;");
    }
    else if(num %3 == 2)
    {
        ui->btn2->setStyleSheet("background-color:green;");
        //ui->btn2->close();
    }
    num++;
}
//断开按钮对应的槽函数
void Widget::on_btn6_clicked()
{

    disconnect(btn3,SIGNAL(pressed()),ui->btn1,SLOT(hide()));

    disconnect(ui->btn4,&QPushButton::clicked,this,&Widget::my_slot);

    //发射自定义的信号
    emit my_signal();

}

2 信号函数与槽函数的总结

  1. 一个信号可以连接到多个槽函数中,当信号被发射后,与之连接的所有槽函数都会被执行
  2. 一个槽函数,可以连接多个信号函数,但凡其中一个信号被发射,那么该槽函数就会被执行
  3. 一个信号函数,也可以连接到另一个信号函数上,表明当前一个信号发射时,后一个信号跟着被发射
  • 信号函数与槽函数参数个数总结

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

signals:               //自定义信号函数
    void my_signal();  

public slots:          //自定义槽函数
    void btn1_slot1();
    void btn1_slot2();
    void my_signal_1_slot(QString m);


private slots:
    void on_btn3_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //1、一个信号可以连接多个槽函数,当信号发射时,所有与之连接的槽函数全部都执行(按钮1连接多个槽函数btn1_slot1、btn1_slot2)
    connect(ui->btn1,&QPushButton::clicked,this,&Widget::btn1_slot1);
    connect(ui->btn1,&QPushButton::clicked,this,&Widget::btn1_slot2);
    //2、一个槽函数可以连接多个信号(将按钮2也连接到槽函数btn1_slot1上)
    connect(ui->btn2,&QPushButton::clicked,this,&Widget::btn1_slot1);

    //3、信号函数连接信号函数,标明发射第一个信号后,第二个信号跟着发着(给按钮2再连接一个my_signal信号)
    connect(ui->btn2,&QPushButton::clicked,this,&Widget::my_signal);
    connect(this,&Widget::my_signal,[](){
        qDebug()<<"德玛西亚";
    });

    //4、连接my_signal_1信号到自定义的槽函数中
    connect(this,SIGNAL(my_signal()),this,SLOT(my_signal_1_slot()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::btn1_slot1()
{
    qDebug()<<"good good study";
}

void Widget::btn1_slot2()
{
    qDebug()<<"day day up";
}

void Widget::on_btn3_clicked()
{
    qDebug()<<"我现在想发射一个my_signal_1_slot信号";
    emit my_signal_1_slot("hello");
}

void Widget::my_signal_1_slot(QString m)
{
    qDebug()<<"我是处理my_signal_1信号的槽函数:"<<m;
}

四、作业

练习:

    优化登录界面。

    当点击登录按钮后,在该按钮对应的槽函数中,判断账户和密码框内的数据是否为admin和123456,如果账户密码匹配成功,则提示登录成功并关闭登录界面,如果账户和密码匹配失败,则提示登录失败,并将密码框中的内容清空。

    当点击取消按钮后,则关闭整个登录界面

要求:对登录按钮使用QT5版本的连接,对取消按钮使用qt4版本的连接,在练习的基础上 完成登录框的按钮操作,并在登录成功后进行界面跳转

1 项目结构

2 头文件 .h

/*********************************第一个文件的头文件*********************************/

#ifndef MYWND_H
#define MYWND_H

#include <QWidget>
#include<QDebug>
#include<QString>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWnd; }
QT_END_NAMESPACE

class MyWnd : public QWidget
{
    Q_OBJECT

signals:
    void jump();  //跳转界面的自定义信号函数   //jump是在头文件中自定义的信号函数

public slots:
    void login_slot();    //登陆界面的自定义的槽函数

public:
    MyWnd(QWidget *parent = nullptr);
    ~MyWnd();

private:
    Ui::MyWnd *ui;
};
#endif // MYWND_H


/*********************************第二个文件的头文件*********************************/

#ifndef FORM_H
#define FORM_H

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public slots:
    void jump_slot();    //跳转界面的自定义的槽函数

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

private:
    Ui::Form *ui;
};

#endif // FORM_H



3 源文件 .cpp

/*********************************第一个文件的源文件*********************************/

#include "mywnd.h"
#include "ui_mywnd.h"

MyWnd::MyWnd(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWnd)
{
    ui->setupUi(this);

        //更改窗口标题
        this->setWindowTitle("MyQQ");

        //更改窗口图标
        this->setWindowIcon(QIcon(":/icon/wodepeizhenshi.png"));

        //更改logo图
        ui->logoLab->setPixmap(QPixmap(":/icon/logo.png"));
        ui->logoLab->setScaledContents(true);                //设置内容自适应

        //更改 账号和密码lab
        ui->userNameLab->setPixmap(QPixmap(":/icon/userName.jpg"));
        ui->userNameLab->setScaledContents(true);
        ui->pwdLab->setPixmap(QPixmap(":/icon/passwd.jpg"));
        ui->pwdLab->setScaledContents(true);

        //设置账户和密码edit
        ui->userNameEdit->setPlaceholderText("QQ/邮箱/手机");
        ui->pwdEdit->setPlaceholderText("密码");
        ui->pwdEdit->setEchoMode(QLineEdit::Password);

        //对按钮设置图标
        ui->loginBtn->setIcon(QIcon(":/icon/login.png"));
        ui->cancelBtn->setIcon(QIcon(":/icon/cancel.png"));

        //将登录按钮连接到自定义的槽函数中
        connect(ui->loginBtn,&QPushButton::clicked,this,&MyWnd::login_slot);

        //将取消按钮连接到自定义的槽函数中
        connect(ui->cancelBtn,SIGNAL(pressed()),this,SLOT(close()));

}

MyWnd::~MyWnd()   //析构函数的定义
{
    delete ui;    //释放ui指针的内存
}

void MyWnd::login_slot()
{
    QString username = ui->userNameEdit->text();
    QString pwd = ui->pwdEdit->text();
    if(username == "admin" && pwd == "123456")
    {
        qDebug()<<"登录成功";
        emit jump();
        this->close();
    }
    else
    {
        qDebug()<<"登录失败";
        ui->pwdEdit->clear();
    }
}


/*********************************第二个文件的源文件*********************************/

#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
}

Form::~Form()
{
    delete ui;
}

void Form::jump_slot()
{
    this->show();
}


4 主函数 main

#include "mywnd.h"
#include"form.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWnd w;
    w.show();

    Form f;
    QObject::connect(&w, &MyWnd::jump,&f,&Form::jump_slot);

    return a.exec();
}

5 运行效果

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

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

相关文章

比较opencv,pillow,matplotlib,skimage读取图像的速度比较

上面这些库都被广泛用于图像处理和计算机视觉任务&#xff1b; 不同的图像读取库&#xff08;OpenCV&#xff0c;Pillow&#xff0c;matplotlib和skimage&#xff09;的读取速度&#xff0c;是怎么样的一个情况&#xff1f; 下面分别从读取速度&#xff0c;以及转换到RGB通道…

端到端自动驾驶综述

End-to-end Autonomous Driving: Challenges and Frontiers 文章脉路 Introduction 从经典的模块化的方法到端到端方法的一个对比, 讲了各自的优缺点, 模块化的好处是各个模块都有自己明确的优化的目标, 可解释性较强, 且容易debug, 缺点是各个模块优化的目标并不是最终的驾…

智能电销机器人,主要体现的价值是什么

21世纪科技的迅速发展&#xff0c;人工智能逐渐走入大家的视线&#xff0c;越来越多的机器人出现在我们生活中。见的最多的有电销公司的智能语音机器人、在仓库拣货打包的机器人、商场店铺供娱乐对话的机器人。机器人活跃在各行各业中&#xff0c;降低了人工成本&#xff0c;代…

Realsense D435i实时运行ORB-SLAM3

三、ORB-SLAM3的ROS编译&#xff08;Realsense D435i实时跑ORB-SLAM3&#xff09; 四、ORB-SLAM3的ROS运行 3. ROS运行单目demo 创建ROS工作空间,初始化 mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make source devel/setup.bash echo "source ~/catkin_ws/devel/…

人生的回忆

回忆是人类宝贵的精神财富&#xff0c;它们像一串串珍珠&#xff0c;串联起我们生活中的每一个片段。 回忆是时间的见证者&#xff0c;它们承载着我们成长、经历、悲欢离合的点点滴滴。 回忆让我们重温过去的欢笑与眼泪&#xff0c;感受那些已经逝去的时光。它们就像一本翻开的…

Jmeter(三十一):制造大批量的用户数据数据

需求&#xff1a;因测试需要&#xff0c;要造100w用户数据&#xff0c;通过用户名、手机号、密码可新增用户&#xff0c;其中用户名和电话号码要求100w用户不能重复 要点&#xff1a; 1、通过Bean shell Sampler实现用户名和手机号的足够随机。 符合我们常用规则的手机号&#…

Shell编程之流程控制

目录 if判断 case语句 for循环 while循环 if判断 语法&#xff1a; if [ 条件判断表达式 ] then 程序 elif [ 条件判断表达式 ] then 程序 else 程序 fi 注意&#xff1a; [ 条件判断表达式 ]&#xff0c;中括号和条件判断表达式之间必须有空格。if&#xff0c;elif…

8个 Python 自动探索性数据分析神库!

探索性数据分析是数据科学模型开发和数据集研究的重要组成部分之一。在拿到一个新数据集时首先就需要花费大量时间进行EDA来研究数据集中内在的信息。自动化的EDA Python包可以用几行Python代码执行EDA。 在本文中整理了10个可以自动执行EDA并生成有关数据的见解的Python包&am…

43、基于 springboot 自动配置的 spring mvc 错误处理,就是演示项目报错后,跳转到自定义的错误页面

Spring MVC 的错误处理&#xff1a;基于 SpringBoot 自动配置之后的 Spring MVC 错误处理。 就是访问方法时出错&#xff0c;然后弄个自定义的错误页面进行显示。 ★ 两种错误处理方式 方式一&#xff1a; 基于Spring Boot自动配置的错误处理方式&#xff0c;只要通过属性文件…

常用的中间件有哪些

中间件是什么 中间件&#xff08;英语&#xff1a;Middleware&#xff09;顾名思义是系统软件和用户应用软件之间连接的软件&#xff0c;以便于软件各部件之间的沟通&#xff0c;特别是应用软件对于系统软件的集中的逻辑&#xff0c;是一种独立的系统软件或服务程序&#xff0c…

Java 16进制字符串转换成GBK字符串

问题&#xff1a; 现在已知有一个16进制字符串 435550D3C3D3DAD4DABDBBD2D7CFECD3A6CFFBCFA2D6D0B4E6B7C5D5DBBFDBD0C5CFA2A3ACD5DBBFDBBDF0B6EE3130302E3036 而且知道这串的字符串对应的内容是&#xff1a; CUP用于在交易响应消息中存放折扣信息&#xff0c;折扣金额100.06 但…

设备报修系统有什么用?企业如何提高维修效率和质量?

在数字化时代&#xff0c;基于人工智能和大数据技术的设备报修系统已经成为企业提高服务质量和效率的重要手段。这种系统可以为用户提供方便快捷的报修方式&#xff0c;例如通过扫描设备上的二维码或通过公众号、企业微信、钉钉等平台提交报修请求。这种报修系统不仅可以提高故…

评估安全 Wi-Fi 接入:Cisco ISE、Aruba、Portnox 和 Foxpass

在当今不断变化的数字环境中&#xff0c;对 Wi-Fi 网络进行强大访问控制的需求从未像现在这样重要。各组织一直在寻找能够为其用户提供无缝而安全的体验的解决方案。 在本博客中&#xff0c;我们将深入探讨保护 Wi-Fi&#xff08;和有线&#xff09;网络的四种领先解决方案——…

Linux土遁术之监测监测进程打开文件

分析问题过程中&#xff0c;追踪进程打开的文件可以在许多不同情况下有用&#xff0c;体现在以下几个方面&#xff1a; 故障排除和调试&#xff1a; 当程序出现问题、崩溃或异常行为时&#xff0c;追踪进程打开的文件可以帮助您找出问题的根本原因。这有助于快速定位错误&…

基于战争策略算法优化的BP神经网络(预测应用) - 附代码

基于战争策略算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于战争策略算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.战争策略优化BP神经网络2.1 BP神经网络参数设置2.2 战争策略算法应用 4.测试结果&#xff1a;5…

AI绘画的一些网址收集

1、负面tag词语收集 https://www.bilibili.com/read/cv19834742 https://y3if3fk7ce.feishu.cn/docx/VOZMdoib8oY7xVxVoYbcA8m1nld 2、如何写关键词 https://y3if3fk7ce.feishu.cn/docx/KqEMdhJigoFY8fxc9TPcwMninKf 3、关键词 https://zhuanlan.zhihu.com/p/573340345 模板词…

电脑提示缺少d3dx9_43.dll的问题及5个解决方法

大家好&#xff01;今天&#xff0c;我将和大家分享一个电脑提示缺少d3dx9_43.dll的问题及其解决方法。这个问题可能会影响到我们在使用电脑时的一些功能&#xff0c;所以掌握这个解决方法对我们来说是非常有帮助的。 首先&#xff0c;我们来了解一下什么是d3dx9_43.dll。d3dx9…

串口接收不定长数据

使用串口进行数据的收发在嵌入式产品中是很常用的一种通信方式&#xff0c;因为串口的简单使用&#xff0c;很容易就被选为产品中数据交互的通信手段。 基于串口进行开发的功能有很多&#xff0c;比如同类/不同类产品之间的通信&#xff0c;RS485通信&#xff0c;RS232通信方式…