Qt之信号与槽应用小结

一、简介
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义 说法,简单点说就是如何在一个类的一个函数中触发另一个类的另一个函数调用,而且还要把相关的参数传递过去.好像这和回调函数也有点关系,但是消息机制可比回调函数有 多了,也复杂多了。
Qt的信号与槽机制依赖QObject中隐含的子对象树和QMetaObject机制,信号的发送者和接受者是通过QObject子对象树找到对方的。详细原理可以参考《An Introducation to Design Pattern in C++ with Qt》的第8章(介绍QObject)和第12章(介绍元编程)。此外,也可以参考博客: Qt源码分析之信号与槽机制

二、什么时候要用信号与槽
1,Qt Designer上的控件,设计“自定义槽函数”时,可优先采用“信号与槽机制”,且推荐使用“在 Qt Designer上的控件右键,转到自定义槽”的方式进行添加。实际生成的代码,Qt会根据槽函数的命名规则(On+控件名+信号名),自动提出信号及其发送者。
2,跨线程进行不同的类之间的函数调用的时候,推荐使用“信号与槽”机制。例如,线程类的线程函数中运行出错时,可以发一个信号给界面类,界面类的槽函数进行响应的处理。 “信号与槽”机制实现了异步调用,无需用户去加锁。
3,需要保持某个类的独立性,以便在不同的工程中copy复用时,可以考虑使用信号与槽机制来实现跨类的函数调用。信号与槽机制能够让代码趋向“高内聚低耦合”。如上一篇博客 Qt布局管理值QSplitter和QuadSplitter  中的应用功能——双击子窗件放大到全屏。该功能,在Plot和mainwindow之间,采用信号与槽机制,从而保证了Plot独立于mainwindow。

三、什么时候不推荐用信号与槽
1,同一个类之间的函数调用,除界面控件响应外,不推荐用信号与槽,而应该直接调用。
注:信号与槽的调用效率远低于直接函数调用。
2,跨类进行大量函数调用的时候,不推荐使用信号与槽。首先,效率比较低;其次,需要写很多个connnect函数。

四、延伸话题
Qt的信号与槽也是一种函数回调机制,函数回调是C语言的一种特点,在C#中用的是委托。

你可能感兴趣的:(Qt之信号与槽应用小结)