#include "widget3.h" Widget3::Widget3(QWidget *parent) : QWidget(parent) { setWindowTitle("自定义信号和槽"); resize(800,640); stu = new Student(); stu->setParent(this); techr = new Teacher(this); // 绑定无参信号 void(Student:: *sleep1)() = &Student::sleep; void(Teacher:: *wakeup1)() = &Teacher::wake_up; connect(stu,sleep1,techr,wakeup1); // 绑定有参的信号和槽函数 void(Student:: *sleep2)(const QString &,int n) = &Student::sleep; void(Teacher:: *wakeup2)(const QString &) = &Teacher::wake_up; connect(stu,sleep2,techr,wakeup2); // 手动发送一个信号 // emit stu->sleep(); // 点击按钮发送学生睡觉的信号 QPushButton *btn = new QPushButton("我睡会",this); btn->resize(120,50); btn->move(20,20); QPushButton *btn2 = new QPushButton("再睡会",this); btn2->resize(120,50); btn2->move(20,90); edit = new QLineEdit(this); edit->resize(300,50); edit->move(20,160); // 将一个信号绑定到另一个信号上,即发送另一个信号 // connect(btn,&QPushButton::clicked,stu,&Student::sleep); // connect(btn,&QPushButton::clicked,this,&Widget3::to_sleep); connect(btn, SIGNAL(clicked()) ,this,SLOT(to_sleep())); // QT4 的信号槽写法 // connect(btn2,&QPushButton::clicked,this,&Widget3::to_sleep2); // Lambda表达式(匿名函数) // connect(btn,&QPushButton::clicked,[&](){ // emit stu->sleep(); // void(Student:: *sleep1)() = &Student::sleep; // void(Teacher:: *wakeup1)() = &Teacher::wake_up; // disconnect(stu,sleep1,techr,wakeup1); // }); connect(btn2,&QPushButton::clicked,[&](){ const QString msg = edit->text(); emit stu->sleep(msg,2); }); } void Widget3::to_sleep() { emit stu->sleep(); // 发送一个睡觉的信号 } void Widget3::to_sleep2() { const QString &msg = edit->text(); emit stu->sleep(msg,2); }