一、信号和槽概述
信号槽是Qt矿建引以为豪的机制之一。
所谓信号槽,实际上就是观察者模式(发布——订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号。这种发出的信号是没有目的的,类似于广播。如果有对象对这个信号感兴趣,它就会使用连接函数(connect),意思是将想要处理的信号和自己的一个函数(称为槽)绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自定被回调。
这就类似于观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
1.1 信号的本质
信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时候Qt对应的窗口类会发出某个信号,对用以此户的挑选做出反应。
根据上面的论述,我们可以得出一个结论——信号的本质就是事件,例如:
- 按钮单击、双击
- 窗口刷新
- 鼠标移动、鼠标按下、鼠标释放
- 键盘输入
在Qt中,信号是通过什么形式呈现给使用者的呢??
- 我们对哪个窗口进行操作,哪个窗口就可以捕捉到这些被触发的事件
- 对于使用者来说,触发一个事件,我们就可以得到Qt框架给我们发出的某个特定信号
- 信号的呈现形式就是函数,也就是说某个事件产生了,Qt框架就会调用某个对应的信号函数,通知使用者。
在Qt中信号的发出者是某个实例化的类对象,对象内部可以进行相关事件的检测。
1.2 槽的本质
在Qt中,槽函数是一类特殊功能的函数,在编码过程中,也可以作为类的普通成员函数来使用。之所以称之为槽函数,是因为它们还有一个职责就是对Qt框架中产生的信号进行处理。
举个例子:
有一天,我们在和女朋友一起逛街,突然,女朋友说:“我肚子饿了!”,于是我们带着她们去吃饭。(这就相当于女朋友发出一个信号,我收到信号并将其处理掉)
实例对象 角色 描述 女朋友 信号发出者 信号携带的信息:我饿了 我 信号接收者 处理女朋友发射的信号:带她去吃饭
在Qt中槽函数的所有者也是某个类的实例对象。
1.3 信号和槽的关系
在Qt中,信号和槽函数都是独立的个体,本身没有任何联系,但是由于某种特性需求,我们可以将二者连接在一起,好比牛郎和织女想要见面,必须要有喜鹊为他们搭桥。
在Qt中,我们需要使用QObject类中的connect函数进行两者的关联。
连接信号和槽的connect()函数原型如下,其中PointerToMenberFunction是一个指向函数地址的指针:
QMetaObject::Connection QObject::connect(
const QObject* sender, PointerToMemberFunction signal,
const QObject* recei