信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性。当某个信号被发射,就需要调用与之相绑定的槽函数。这与Windows下的消息机制类似,消息机制是基于回调函数。一个回调即是一个函数的指针,因此如果希望一个处理函数通知一些事件,可以传递一个函数(回调函数)的指针给这个处理函数。这个处理函数就会在适当的时候调用回调函数。但是回调函数有两大缺点:第一,它们不是类型安全的。我们从来不敢确定处理函数会用正确的参数来调用回调函数;第二,回调函数被强力和处理函数联系着,因为处理函数必须知道去调用哪个回调函数。
信号和槽的机制是类型安全的:一个信号的签名必须与接收槽的签名相匹配。(实际上一个槽可能有一个比它所接收到的信号的签名更短的签名因为它能够忽略额外的参数。)因为签名是一致的,所以编译器能够帮助我们发现类型不匹配。信号和槽是松散的联系在一起的:一个发射信号的类从来不知道也不关心哪个槽接收这个信号。Qt的信号和槽机制确保如果你将一个信号和一个槽连接起来,这个槽将在正确的时间被用这个信号的参数所调用。信号和槽可以带任何数量任何类型的参数。它们完全是类型安全的。
信号(Signals)
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
信号只需要在头文件中进行声明,不需要在cpp中实现。放在Qt自定义关键字signals下,在此之前一定要加上Q_OBJECT宏。
在编程中,一般使用的是控件内部定义好的信号。如:QTreeWidget类下的 Signals:
void currentItemChanged ( QTreeWidgetItem * current, QTreeWidgetItem * previous );
void itemActivated ( QTreeWidgetItem * item, int column );
void itemChanged ( QTreeWidgetItem * item, int column );
void