信号和槽

来源:互联网 发布:汕头峡山淘宝拍摄 编辑:程序博客网 时间:2024/06/04 19:18

信号和槽
信号和槽用来实现对象之间的通信。信号和槽机制是qt的核心机制。其由Qt的元对象系统实现。
介绍
在GUI编程中,我们希望通过改变一个组件来通知另一个组件。通常我们想要一个对象与另一个对象通信。例如,如果一个用户点击了一个Close Button,则我们想要一个窗口close被调用。
其他的工具包通过回调来实现通讯。一个回调是一个函数指针,所以,如果你必须向处理函数发送指针来通知函数某个事件发生。接着处理函数调用回调函数。尽管许多成功的框架使用这种方法,但是回调函数并不是非常直观而且可能在确保回调参数的类型正确上面临问题。

信号和槽
在qt,使用了改进的回调技术:我们使用信号和槽。当一个事件发生时,就会发送信号。qt组件有许多预定义好的组件,我们也可以子类化它们来添加自己的信号。槽是一个用来响应信号的函数。qt组件也预定义了许多槽,可以通过过子类化它们添加自己的槽。
这里写图片描述
信号和槽是类型安全的:信号的签名必须匹配槽的签名。(实际上槽的签名可能短于信号的签名,因为它可能会忽略掉额外的参数)因此,签名是兼容的,编译器可以帮助我们检测基于指针语法的函数的不匹配。基于字符串语法的SINGAL和SLOT,会在运行时检测其类型是否匹配。信号和槽是松耦合。发送信号的类不知道也不关心是谁来接收信号。当连接了一个信号和槽,信号和槽机制,将确保槽在正确的时间被调用。信号和槽可以携带任何数量,任何类型的参数。它们是完全类型安全的。
所有集成QObject及其子类的类都可以包含信号和槽。发送信号的类并不知道是否有对象接受信号。这是一个正确的信息封装,并且确保可以把对象封装成一个组件。
槽可以接收信号,而且它们是普通的成员函数。仅仅作为一个对象并不会知道是否有对象接收它的信号,槽也不知道是否有信号会连接它。这确保了被qt创建的组件是独立的。
可以连接许多信号到槽,槽一个可以被多个信号连接。直接连接两个信号也是可以得。(当第一个信号触发时,将会立即发送两个信号)。

信号
信号定义成公共访问权限,可以在任何地方发送它,但强烈建议在包含他的类及其子类中发送它。
通常,信号发送时连接它的槽会立即执行,这种情况下,信号和槽通常独立于GUI事件循环。代码中跟随在emit声明后的代码会在所有槽返回后执行一次。当使用 queued connections时,情况会有些不同,在emit关键字声明后的代码回持续执行,slots稍后执行。
如果一个槽被多个信号连接,它会根据connect的顺序依次执行。
信号有moc自动产生,切没有有返回类型。
如果不使用特殊类型,信号和槽大部分可重复使用。

槽是不同的成员函数,然而不管访问权限如何,可以被任何组件调用。
可以将槽定义成虚拟函数。
相较于回调函数,信号和槽由于其要实现灵活性,所以从发送信号到槽,大约慢10倍左右,不包括虚函数调用。但是为了灵活性和简单性这些耗费都是值得的。
注意,如果信号和槽调用了其他库中的变量可能会产生警告或错误,为了解决这个问题,#undef 这些不和规则的预处理符号。

原创粉丝点击