2.2 信号与插槽
信号与插槽机制提供了对象间的通信机制,它易于理解和使用,并完全被 Qt 图形
设计器所支持。
图形用户接口的应用需要对用户的动作做出响应。例如,当用户点击了一个菜单项
或是工具栏的按钮时,应用程序会执行某些代码。大部分情况下,我们希望不同类型的
对象之间能够进行通信。程序员必须把事件和相关代码联系起来,这样才能对事件做出
响应。以前的工具开发包使用的事件响应机制是易崩溃的,不够健壮的,同时也不是面
向对象的。Trolltech 已经创立了一种新的机制,叫做“信号与插槽”。信号与插槽是一
种强有力的对象间通信机制,它完全可以取代原始的回调和消息映射机制;信号与插槽
是迅速的,类型安全的,健壮的,完全面向对象并用 C++来实现的一种机制。
在以前,当我们使用回调函数机制来把某段响应代码和一个按钮的动作相关联时,
我们通常把那段响应代码写成一个函数,然后把这个函数的地址指针传给按钮,当那个
按钮被按下时,这个函数就会被执行。对于这种方式,以前的开发包不能够确保回调函
数被执行时所传递进来的函数参数就是正确的类型,因此容易造成进程崩溃,另外一个
问题是,回调这种方式紧紧的绑定了图形用户接口的功能元素,因而很难把开发进行独
立的分类。
Qt的信号与插槽机制是不同的。Qt的窗口在事件发生后会激发信号。例如一个按钮
被点击时会激发一个“clicked”信号。程序员通过建立一个函数(称作一个插槽),
对象1
图一 一些信号与插槽连接的抽象图
然后调用 connect()函数把这个插槽和一个信号连接起来,这样就完成了一个事件和响
应代码的连接。信号与插槽机制并不要求类之间互相知道细节,这样就可以相对容易的
开发出代码可高重用的类。信号与插槽机制是类型安全的,它以警告的方式报告类型错
误,而不会使系统产生崩溃。
例如,如果一个退出按钮的clicked() 信号被连接到了一个应用的退出函数-
信号 1
信号 2
插槽 1
插槽 2
插槽 1
插槽 2
插槽 3
信号 1
信号 1
对象 3
对象 4
connect( 对象1, 信号1, 对象2, 插槽1 )
connect( 对象1, 信号1, 对象2, 插槽2 )
connect( 对象1, 信号2, 对象4, 插槽1 )
connect( 对象3, 信号1, 对象4, 插槽3 )
对象 2