1.信号与信号连接
更改代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPushButton>
//Teacher类
//Student类
//下课后老师会触发一个信号(饿了),学生响应信号(请客吃饭)
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师的对象
this->th = new Teacher();
//创建一个学生的对象
this->stu = new Student();
//重载连接,需要用到函数指针,指向明确的函数地址
//无参函数连接,两种写法
void(Teacher::* teacherSignal0)() = &Teacher::hungry;
void(Student::* studentSlot0)(void) = &Student::treat;
connect(th,teacherSignal0,stu,studentSlot0);
//有参连接
void(Teacher::* teacherSignal)(QString) = &Teacher::hungry;
void(Student::* studentSlot)(QString) = &Student::treat;
connect(th,teacherSignal,stu,studentSlot);
//点击叮叮叮按钮,再触发下课
QPushButton* btn = new QPushButton("叮叮叮",this);
//第一种实现
//connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
//第二种实现
//信号连接信号
connect(btn,&QPushButton::clicked,th,teacherSignal0);
resize(400,400);
}
void Widget::classIsOver()
{
//下课函数,触发后发送老师饿了的信号
//emit出发信号 qt独有语法
emit th->hungry();
emit th->hungry("昏睡红茶");
qDebug() << "------------";
}
Widget::~Widget()
{
delete ui;
}
注意:信号连接时,信号与槽的参数必须一一对应。不然会报
static assertion failed: Signal and slot arguments are not compatible.
的bug。
扩展内容
- 一个信号可以连接多个槽函数
- 多个信号可以连接一个槽函数
- 信号和槽函数的参数必须一一对应
- 信号参数个数可以多余槽的参数个数,但类型要一一对应
Qt4版本以前的信号与槽的连接
连接无参
connect(th,SIGNAL(hungry()),stu,SLOT(treat()));
优点,参数直观。缺点,类型不做检测(编译不做检测,运行报错)
Qt5以上支持Qt4的写法,反之不支持。