信号与槽

信号槽是QT非常核心的一种调用,我是感觉非常像回调函数,因为信号的触发是可以有条件的,比如网络的sock,监听到有链接到来就发射信号,然后槽函数去处理

在或者是自己定义的信号,比如监听谋一个值,当这个值变化的时候,就发射一个信号去处理,只是自定义的信号是自己写的,

 

回调函数就是把函数当成参数传给fun,这个函数你只是传进去, 什么时候调用你没办法知道,可能传进去就调用了、

也可能像EPOLL那样传进去后等待系统监听信号到来的时候去调用,

 

自定义信号槽

class a

{

signale:

  viod xinhao();信号只需要定义

}

class b

{

public  slots:

  void cao(); 槽函数需要实现

}

a aa;

b bb

connect(aa,&a::xinhao,b,&bb::cao); 方式1
connect(aa,&a::xinhao,this,[=](){
       emit showWindow();   //触发信号 又发射信号
    });
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->spinBox,SLOT(setValue(int)));个人比较喜欢用这种,信号如果有参数,那么槽函数也得有,当emit的时候也带上参数
信号和槽可以一对多,信号应对多个槽, 多个信号对应一个槽,不管在哪个文件中,只要能包含信号的头文件,就能发射信号,main中肯定不行,发射信号的对象和绑定的对象需要一致
比如槽函数在B中
信号可以在 A1 A2 A3。。 的signals中定义,在构造中connect(this,&A1::xinhao,bb,&B::cao);
然后在定义一个函数实现emit xinhao();

然后可以在其他文件中包含A1头文件,然后调用a1.fun();

比如弄个键盘事件
void keyPressEvent(QKeyEvent *ev);
虽然可以跟普通函数一样 直接调用fun2去通知用户按了某个键,没必要去调用a1.fun
但是在不是我们写的信号中,比如网络通知,读写缓冲区通知,connect链接一下,然后等待信号触发,然后执行槽函数,
这里就有点像回调了,system触发信号然后调用槽
其实信号槽更像是一个广播,我们定义的信号也好,还是QT自带的信号,都可能在某个地方进行广播,如果有需要就可以链接一下,等信号触发 就链接到我们这里了


其实在了解信号槽的时候 是有一个困惑的, 就是我自定义信号和槽的时候 比如信号在A,槽在B,然后在C中发射监听键盘按键事件的信号(emit 在C中肯定是发射的对象信号肯定是this.a.xinhao,此时a的对象和绑定的信号是一样的 ),
如果写代码是不可见,不可更改的,或者说是模拟QT的信号,

我现在创建一个D文件,我想使用A和B中的信号槽,于是我现在D中new出A,B,connect(A,A::,B,B::) 但是丫的C里发射的信号跟我new出的A没关系, 原因也很简单,在D中new出的A与 D中发射的A.xinhao信号不一样,QT中肯定有更加厉害的实现方法,
因为我这里是ABC都是自定义的,
所以我直接在C里加了一个对象成员变量,new出的对象放在这里,然后直接C.xinhao ,





posted @ 2022-01-16 12:10  咖喱给给啊  阅读(106)  评论(0)    收藏  举报