QT2:信号槽机制与回调函数的区别
(1) MFC的消息响应机制:
MFC消息响应函数在程序中有三处相关信息:函数原型、函数实现和以及用来关联消息和消息响应函数的宏。
①消息映射宏:
在视图类的源文件中, BEGIN MESSAGEMAPO和END-MASSAGEMAPO这两个宏之间定义了消息映射表 ,这个宏的作用就是把消息与一个消息响应函数关联起来,通过这种机制,一旦有消息产生,程序就会调用相应的!消息响应函数来进行处理。
②函数原型:
在消息响应函数的函数原型中,函数声明的前部有一个afxmsg限定符,也是一个宏,该宏表明这个函数是一个消息响应函数的声明。
③消息响应函数实现:
当有消息需要处理时,程序搜索消息映射表,查看表中是否含有该消息,就可知道该类能否处理此消息如果能处理此消息,则同样依照静态表能找到并调用对应的消息处理函数。
(2) MFC的回调函数:
MFC中有两类回调函数:一类是源自C的传统回调函数,此类回调函数若非定义为全局函数,而定义在类中的话,要添加static约束;一类是消息响应函数,通过成员函数指针实现回调。因此, MFC中的所有消息响应函数都是回调函数。
回调是指向函数的指针,把这个指针传递给一个要被处理的函数,就可以在这个函数被处理的时候调用回调图数。
(3) QT信号槽机制与MFC消息响应机制:
1)在QT中应用信号槽机制实现对象间的通信, MFC中应用回调机制实现对象之间的通信。在QT中应用事件机制实现外部事件, MFC中应用消息响应机制处理外部事件。
2)以按钮的click事件为例:
①在QT中不能像vs中一样通过双击按钮或者添加事件来转到代码界面编写click函数,而是需要先定义一个槽函数,然后将槽函数和按钮的click信号通过connect函数绑定,在这里一个槽函数可以被多个信号绑定,一个信号也可以绑定多个槽函数。这个槽函数不属于这个按钮对象的成员函数。
②在MFC中,可以通过双击按钮或者添加事件为按钮对象编写成员函数。
③总结:按下按钮执行click事件这个过程中分为两个部分,
1.在"点击鼠标这个动作转到click"这个过程中, QT应用了事件机制(一个对象的事件处理函数属于它的成员函数) ,执行"按鼠标"后通过事件过滤器过滤、执行事件,最终发送一个click信号;而MFC通过消息喊应机制,将"按鼠标"和click函数通过宏联系起来。
2.在"执行click对应的相关操作"这个过程中, QT应用了信号槽机制,通过接收到click信号后执行与的槽函数,完成相应操作;而MFC直接执行click函数内白过程相当于一个回调。