Qt的信号与槽机制

来源:互联网 发布:oa系统数据库表设计 编辑:程序博客网 时间:2024/05/26 12:53

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击