C++| QT自定义信号和槽

前言:之前学习QT都是使用自带的信号进行槽函数触发,一直没有找到需要使用自定义信号的场景,但最近读QT项目代码的时候,应用到了自定义信号,所以特地写这篇总结一下。

信号和槽

信号与槽(Signal & Slot)是QT的一个创新,用来方便处理各个组件的交互操作。类似于观察者模式,让互不干扰的对象之间建立一种联系,当信号发出的时候,被来连接的槽函数就会自动被回调。

信号(Signal)是指的在特定情况下被发射的事件,例如PushButton被鼠标点击触发clicked事件信号。

(Slot)是对应信号响应的函数,和普通C++成员函数基本没有区别,唯一区别在于可以被信号触发。

关联(connect)指定什么样的信号执行什么样的槽函数。

为什么要自定义信号

作为一个QT新手,自定义槽函数用的可能多,但是自定义信号用的场景确实很少。因为大部分时候使用信号和槽,都是为了和界面组件进行交互,这个场景下通常只需要用QT自带的信号。

QT信号和槽机制就是个强大的通信机制,当我们需要让互不干扰的对象之间建立一种联系,又没法用QT自带的信号的时候,就需要自定义了。例如我们需要两个ui界面进行交互,A界面输入的数据能够更新到B界面,A输入完数据后就可以发送信号让B中槽函数响应并更新相同的数据。

把信号和槽当作是QT提供一种对象之间的通信工具就好了,用熟了实现很多联动功能很方便。

如何自定义信号和槽

信号定义要求:

  • 信号是类的成员函数。
  • 返回值必须是void类型。
  • 信号需要使用signals关键字进行声明,类似public等关键字。
  • 信号只需要声明,不需要具体实现。
signals:
    void signal_01();
    void signal_01(QString);

自定义要求:

  • 返回值必须是void类型。
  • 槽函数可以是类的成员函数、全局函数、静态函数、Lambda表达式(匿名函数),是需要有具体实现的。
  • 槽函数的参数要和信号匹配,但可以小于信号的参数,因为槽函数是用来接受信号传递的数据。
public slots:
    void slot_01();
    void slot_01(QString);

信号和槽的关系

  • 一个信号可以连接到多个槽。
  • 一个槽可以被多个信号连接。
  • 信号也可以连接到信号,例如某个信号发射会导致另一个信号发射。
  • 信号的参数可以大于等于槽函数的个数。

关联通过connect函数进行信号和槽的关联,connect使用格式如下:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

sender是信号的发送者(类对象),signal是发送的信号,receiver是信号的接收者(类对象),slot是处理函数(槽函数)。
当sender调用了signal的时候,receiver当中的slot就会响应,所以signal是sender类的成员,slot是receiver类的成员。
使用注意:sender和receiver需要继承QObject类。

发送信号使用emit进行信号的发送:

emit void Signal();

发送后就会调用信号关联槽函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值