Qt学习笔记4—信号和槽

6. 信号和槽

6.1 连接函数

Connect( 信号的发送方,发送的具体信号,信号的接收方,信号的处理(槽))
//参数1 信号的发送者
//参数2 发送的信号(函数的地址)
//参数3 信号的接收方
//参数4 处理的槽函数

//实现点击按钮关闭窗口的功能
connect(mbtn,&QPushButton::clicked,this,&myWidget::close);

6.2 信号槽的优点:松散耦合。

信号的 发送端 和 接收端 本身是没有关联的,通过 connect 连接,将两端 耦合 在一起。

6.3 自定义的信号和槽

6.3.1 自定义信号
 返回值 void
 需要声明,不需要实现
 可以有参数
 写到signal下
6.3.2 自定义槽
  返回值void
  需要声明,需要实现
  可以有参数

老版本写到 public slot下,新版本写到 public 或者全局下

6.3.3 触发自定义的信号
   Emit 自定义信号
   emit zt->hungry();
案例 - 下课后,老师触发 饿了 信号,学生响应信号,请客吃饭
  //创建一个老师对象
    this->zt = new Teacher(this);
    //创建一个学生对象
    this->st = new Student(this);
    //老师饿了 学生请客的连接
    connect(zt,&Teacher::hungry,st,&Student::treat);
    //调用下课函数,触发饿了信号 (先创建好连接,再触发下课这件事)
   classIsOver();

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

6.4 当自定义信号和槽出现重载

函数指针
 利用函数指针 明确指向函数的地址
 void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
    void(Student:: *studentSlot)(QString) = &Student::treat;
    connect(zt,teacherSignal,st,studentSlot);
Qt4版本以前的信号和槽的连接方式

Connect( 信号的发送者,发送的信号 SIGNAL(信号),信号的接受者,槽函数 SLOT(槽函数))

connect(zt,SIGNAL(Teacher::hungry(QString)),st,SLOT(Student::treat(QString)));
//优点:参数直观   缺点:信号的槽对应的参数类型不做检测  (一般不推荐使用)
Qstring 转 char *
//QString -> char *
 //先转 QByteArray ( .toUtf8() ) 再转成 char * ( .data() )
qDebug()<<"请老师吃饭,老师要吃:"<<foodName.toUtf8().data()<<endl;

6.5 信号连接信号

信号可以连接信号

//信号连接槽
connect(zt,teacherSignal2,st,studentSlot2);1//信号连接信号
connect(btn,&QPushButton::clicked,zt,teacherSignal2);2

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

拓展:

  1. 信号可以连接信号
  2. 一个信号可以连接多个槽函数
  3. 多个信号可以连接同一个槽函数
  4. 信号和槽函数的参数必须一一对应
  5. 信号和槽的信号个数 是不是要一致? 信号的参数个数 可以多于槽的参数个数(对应的类型一致)(不可逆)

你可能感兴趣的:(Qt,qt,c++)