#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);
}
