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("宫保鸡丁");
});