【Qt】信号&槽

信号和槽

信号和槽被用于对象之间的通信。信号和槽机制是 Qt 的一个核心特性,也许是与其他框架提供的功能最不同的部分。信号和槽是通过 Qt 的元对象系统实现的。

简介

在 GUI 编程中,当我们改变一个小部件时,通常希望另一个小部件能够收到通知。更一般地说,我们希望任何类型的对象都能够相互通信。例如,如果用户点击一个关闭按钮,我们可能希望窗口的 close() 函数被调用。

其他工具包使用回调来实现这种通信。回调是指向函数的指针,因此如果您希望处理函数通知您某个事件,您将一个指向另一个函数(回调)的指针传递给处理函数。处理函数在适当的时候调用回调。虽然使用此方法的成功框架确实存在,但回调可能不直观,并且在确保回调参数的类型正确性方面可能会遇到问题。

信号和槽

在 Qt 中,我们有一种替代回调技术的方法:我们使用信号和槽。当特定事件发生时,会发射一个信号。Qt 的小部件有许多预定义的信号,但我们始终可以对小部件进行子类化,以向它们添加我们自己的信号。槽是响应特定信号调用的函数。Qt 的小部件有许多预定义的槽,但通常的做法是对小部件进行子类化并添加自己的槽,以便您可以处理您感兴趣的信号。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信号和槽机制是类型安全的:信号的签名必须与接收槽的签名匹配。(实际上,槽的签名可以比接收的信号短,因为它可以忽略额外的参数。)由于签名是兼容的,编译器可以帮助我们在使用基于函数指针的语法时检测类型不匹配。基于字符串的 SIGNAL 和 SLOT 语法将在运行时检测到类型不匹配。信号和槽是松散耦合的:发射信号的类既不知道也不关心哪些槽接收信号。Qt 的信号和槽机制确保如果将信号连接到槽,槽将在正确的时间使用信号的参数调用。信号和槽可以接受任意数量的任意类型的参数。它们是完全类型安全的。

所有继承自 QObject 或其子类的类都可以包含信号和槽。当对象以可能对其他对象感兴趣的方式更改其状态时,它们会发出信号。这是对象进行通信的全部内容。它不知道也不关心是否有任何东西接收它发出的信号。这是真正的信息封装,并确保对象可以作为软件组件使用。

槽可用于接收信号,但它们也是普通的成员函数。正如对象不知道是否有任何东西接收其信号一样,槽也不知道是否有任何信号连接到它。这确保可以使用 Qt 创建真正独立的组件。

您可以将任意数量的信号连接到单个槽,并且一个信号可以连接到尽可能多的槽。甚至可以将一个信号直接连接到另一个信号。(这将在第一个信号发出时立即发出第二个信号。)

综合起来,信号和槽组成了一个强大的组件编程机制。

信号

当对象的内部状态发生变化时,该对象可能会发出信号。信号是公共访问函数,可以从任何地方发出,但我们建议只从定义信号及其子类的类中发出。

当信号被发出时,通常与其连接的槽会立即执行,就像普通的函数调用一样。在这种情况下,信号和槽机制完全独立于任何 GUI 事件循环。在所有槽返回后,emit 语句后的代码才会执行。当使用排队连接时情况稍有不同;在这种情况下,emit 关键字后面的代码将立即继续执行,而槽将稍后执行。

如果有多个槽连接到一个信号,当信号被发出时,这些槽将按连接的顺序依次执行。

信号是由 moc 自动生成的,不能在 .cpp 文件中实现。它们永远不能具有返回类型(即使用 void)。

关于参数的说明:我们的经验表明,如果信号和槽不使用特殊类型,则它们更具可重用性。如果 QScrollBar::valueChanged() 使用了一个名为假设的特殊类型 QScrollBar::Range&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值