【QT5】信号与槽笔记

信号与槽

在sender发出信号后,receiver的指定槽函数会自动触发

没有重载信号的情况下

connect函数用于

connect(&sender, &signal, &receiver, &slot);
其中的参数都是指针对象:
sender:发出信号的对象
signal:发送对象发出的信号
receiver:接收信号的对象
slot:接收对象在接收到信号之后所需要调用的函数
注:signal以及slot需要在使用的过程中需要加上作用域
例如设置按钮button的点击响应函数:

connect(button, &QButton::click, this, &MyWindow::buttonSlot);

其中buttonSlot为Mywindow类的槽函数

有重载信号的情况下

有重载信号的情况下,比如定义了如下两个名称相同,参数不同的信号,
void MySignal1();
void MySignal1(QString &);
在调用信号的时候,信号发出者不知道要发出的信号是有参数的还是没有参数的,造成程序错误,此时需要采用指针指向函数的形式,避免这种错误。
形式如下
void(信号作用域::*指针信号名称)(信号携带的参数)=(信号作用域::信号的名称);
切记,等号右边信号名称的后边不可以继续加(信号携带的参数项);
比如定义信号:
signals:
void MySignal1();
void MySignal1(QString &);
编辑相应槽函数应如下:
不带参:

void (MyWidget::*Sign11)()= &MyWidget::MySignal1;
connect(this,Sign11,this,&MyWidget::MySlot1_5);

带参:

void (MyWidget::*Sign12)(QString &)= &MyWidget::MySignal1;
connect(this,Sign12,this,&MyWidget::MySlot1_5);

其中,MySlot1_5为自定义的槽函数。

Lambda表达式作为槽函数

可以使用lambda表达式作为一个匿名函数响应信号

注意

若在多线程中使用信号与槽机制,需要添加Q_OBJECT标记。此时再编译可能会出现如下错误

undefined reference to vtable for “xxxx”

出现该错误的原因是此时的 Q_OBJECT 是半途加入的。
我们需要让项目重新加载编译,解决的办法是直接在 .pro 文件中随便改动一点东西,即使是随便加个空格都可以,此时再编译就可以通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值