1 简介
信号和槽机制是Qt编程的基础。它可以让编程人员将两个没有任何联系的对象绑定在一起。类似于windows下消息机制,它是基于回调函数,而Qt中信号与槽来代替函数指针,3程序更安全简洁。
2 信号
当对象的状态改变时,信号就由该对象通过关键字emit发射出去,且对象只负责发送信号,它不知道另一端是谁在接受这个信号。这样就做到了正真的信息封装,能确保对象当作一个真正的软件组件来使用。
3 槽
用来接受信号,而且槽知识普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连。而且对象并不了解具体的通信机制。
4 信号与槽的连接
所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。可根据对象继承的顶级父类可知道是否支持信号和槽。Inherits: QWidget.
信号与槽的连接如:
connect(sender, SIGNAL(signal), receiver,SLOT(slot));
这里的sender和receiver是指向QObject的指针,signal和slot函数名。SIGNAL和SLOT宏将它们的参数转换成相应的字符串。注意:sender必须要有signal信号,receiver必须要有slot槽
可用“手按开关灯亮”的事件,来说明信号与槽的简单联系。connect(手, SIGNAL(按), 开关,SLOT(灯亮));
5 信号的连接
1 一个信号可以连接多个槽(槽的调用顺序不确定)
2 多个信号可以连接同一个槽
3 一个信号可以与另外一个信号连接
6 信号的移除
使用disconnect, 此时会删除该对象相关的所有连接。
7 信号的使用
1 信号与槽的参数必须相同
2 如果信号的参数比槽的参数多,多余的参数就会忽略掉
3 连接不成功,Qt程序运行时会有警告
8 Qt的元对象系统
1 Q_OBJECT宏声明每一个QObject子类中必须实现的一些内省函数:metaOBject(),tr(),qt_metacall(),以及其他函数
2 Qt的moc工具生成了用于由Q_OBJECT声明的所有函数和所有的信号实现
9 使用信号与槽机制应该注意的一些问题
1. 在实时系统中就要尽可能的少用这种机制。
2.信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。
3 .如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
4. 宏定义不能用在 signal和 slot 的参数中。
5. 构造函数不能用在 signals或者 slots 声明区域内。
6. 函数指针不能作为信号或槽的参数。
7. 信号与槽不能有缺省参数。
8. 信号与槽也不能携带模板类参数。
9. 嵌套的类不能位于信号或槽区域内,也不能有信号或者槽。
10. 友元声明不能位于信号或者槽声明区内。
参考博客:
http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html