【QT从零开始系列03】自定义信号与槽、Lambda

01 自定义信号与槽

//Teacher 类 老师类
//Student 类 学生类
//下课后,老师会触发一个信号,饿了,学生响应信号,请客吃饭

teacher.h

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = 0);

signals:
    //自定义信号 写到signals下
    //返回值是void ,只需要声明,不需要实现
    //可以有参数,可以重载
    void hungry();


public slots:
};

#endif // TEACHER_H


student.h

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = 0);

signals:

public slots:
    //早期Qt版本 必须要写到public slots,高级版本可以写到public或者全局下
    //返回值void,需要声明,也需要实现
    //可以有参数,可以发生重载
    void treat();
};

#endif // STUDENT_H

widget.cpp

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

//Teacher 类 老师类
//Student 类 学生类
//下课后,老师会触发一个信号,饿了,学生响应信号,请客吃饭

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

    //创建老师对象
    this->zt = new Teacher(this);

    //创建学生对象
    this->st = new Student(this);

    //老师饿了 学生请客的连接
    connect(zt,&Teacher::hungry,st,&Student::treat);

    //调用下课函数
    classIsOver();
}

void Widget::classIsOver()
{
    //下课函数,调用后 触发老师饿了的信号
    emit zt->hungry(); //发射函数
}

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

重载信号和槽

//teacher.h
void hungry(QString foodName);

//student.h
void treat(QString foodName);

//student.cpp
void Student::treat(QString foodName)
{
    qDebug() << "请老师吃饭,老师要吃:" << foodName ;
}

//widget.cpp
	//连接带参数的 信号和槽
    //指针 -> 地址
    //函数指针 -> 函数地址

    void(Teacher::*teacherSignal)(QString) = &Teacher::hungry;
    void(Student::*studentSlot)(QString) = &Student::treat;
    connect(zt, teacherSignal, st , studentSlot);
    classIsOver();

void Widget::classIsOver()
{
    //下课函数,调用后 触发老师饿了的信号
    //emit zt->hungry();
    emit zt->hungry("宫保鸡丁");
}

QString -> char *

void Student::treat(QString foodName)
{
    //QString带引号
    //QString -> char * 先转成QByteArray ( .toUtf8() ) 再转char * ( .data())
    qDebug() << "请老师吃饭,老师要吃:" << foodName.toUtf8().data() ;

}

点击按钮触发信号

//点击一个 下课的按钮,再触发下课
    QPushButton *btn = new QPushButton("下课",this);
    //重置窗口大小
    this->resize(600,400);

    //点击按钮 触发下课
    connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

//无参信号和槽连接
    void(Teacher::*teacherSignal2)(void) = &Teacher::hungry;
    void(Student::*studentSlot2)(void) = &Student::treat;
    connect(zt, teacherSignal2, st , studentSlot2);

    //信号连接信号
    connect(btn,&QPushButton::clicked,zt,teacherSignal2);

	//断开信号
    //disconnect(zt, teacherSignal2, st , studentSlot2);

    //拓展:
    //1、信号是可以连接信号
    //2、一个信号可以连接多个槽函数
    //3、多个信号 可以连接 同一个槽函数
    //4、信号和槽函数的参数 必须类型一一对应
    //5、信号的参数个数 可以大于 槽的参数个数
	//信号(QString,int)  槽(QString )    可以
	//信号(int, int )     槽(QString)     不行

	//Qt4版本的信号和槽连接方式
    //利用Qt4信号槽 连接无参版本
    connect(zt, SIGNAL(hungry(),st, SLOT(treat());
    //connect(zt, SIGNAL(hungry(),st, SLOT(treat(QString)); //错误不earning
    //Qt4版本优点:参数直观 ,缺点:类型不做检测
    //Qt5以上 支持Qt4的版本写法,反之不支持

在这里插入图片描述

Lambda

在这里插入图片描述
在这里插入图片描述

    [=](){
        btn->setText("aaa");
    }();

//    QPushButton * btn2 = new QPushButton;

//    [btn](){
//        btn->setText("aaa");
//        btn2->setText("bbb");  //btn2看不到
//    }();
//利用lambda表达式 实现点击按钮 关闭窗口
    QPushButton * btn2 = new QPushButton;
    btn2->setText("关闭");
    btn2->move(100,0);
    btn2->setParent(this);
    connect(btn2,&QPushButton::clicked,this,[=](){
        //this->close();
        emit zt->hungry("宫保鸡丁");
    });

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BV8pWgby-1582870154643)(C:\Users\king\AppData\Roaming\Typora\typora-user-images\image-20200119192103901.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值