Qt-信号/槽(signal/slot)机制
sf2gis@163.com
2015年1月6日
2015年3月28日添加信号映射
2015年3月29日添加断开连接
1 目的:对象之间的交互机制。
2 方法
2.1 回调函数
在信号/槽机制之前,一般使用回调函数进行交互。但是这种方式有两个基本的问题:一是类型安全问题,函数对象无明确类型。二是高度耦合,回调函数必须被明确包含在处理函数中。
2.2 信号/槽
信号和槽进行连接后,调用信号就会调用槽。由于信号和槽都是成员函数,是类型安全的。默认情况下也是线程安全的,如果指定了类型,可能降级为类型安全。
信号和槽是完全无关的,使用connect连接才能建立联系,并且槽函数可以忽略信号的参数,两者之间是松散耦合的。
因此,在使用时要注意信号-槽之间的解耦。
3 信号/槽详解
3.1 目标:将一个类的事件向其它发送,并使用相关类可以处理这种事件。
3.2 原理:信号-槽机制-自动化的回调函数。
在执行时,qmake会调用MOC(metaObject compiler)工具,将QObject相关的类重新生成一个新的类MOC_xxx.cpp/h,这时,将所有信号转换为相应的回调函数(槽函数),发出信号就会调用槽函数(参见QObject.cpp->QMetaObject::activate())。
参考 http://woboq.com/blog/how-qt-signals-slots-work.html
c++ - Qt Signals and slot thread safety - Stack Overflow
3.2.1信号-槽
信号与槽技术是Troll Tech公司独立创建的技术。使用MOC(meta object compiler)创建合乎C++标准的回调函数。
信号是特殊的成员函数,只有声明无实体。emit关键字是可选标记。signal/slot也是标记。
Q_OBJECT也是用于标记的宏,只有声明此宏,才会进行信号槽的解析。
signal信号:代表事件,包含用户事件,内部状态事件。使用成员函数实现。
发射信号:emit(可选)。
slot槽:处理事件。标准函数+添加slot标志。
connect连接:将signal与slot进行connect,这样在emitsignal时就调用slot。
QSignalMapper实现信号-槽的连接,只能int,const QString&,QObject *,QWidget*可以作为参数。