Qt中事件和信号之间有什么区别

时间:2012-02-17 06:31:07

标签: qt events signals

我很难理解Qt中信号和事件之间的区别,有人可以解释一下吗?

4 个答案:

答案 0 :(得分:11)

事件是封装在类(QEvent)中的消息,它在事件循环中处理并分派给可以接受消息或将其传递给其他人进行处理。它们通常是为响应鼠标点击等外部系统事件而创建的。

信号和广告位QObject彼此通信的便捷方式,与回调函数更相似。在大多数情况下,当发出“信号”时,直接调用连接到它的任何插槽功能。例外情况是信号和插槽跨越线程边界。在这种情况下,信号将基本上转换为事件。

答案 1 :(得分:5)

事件发生在 对象中。通常,您可以在对象自己的类代码中处理它们。

一个对象发出信号。该对象基本上是通知其他对象发生了什么事。其他对象可能会做某事或不做,但这不是发射器的工作来处理它。

答案 2 :(得分:2)

事件直接传递给类的事件处理程序方法。它们可供您在子类中重载,并选择以不同方式处理事件的方式。事件也会从子节点传递到父节点,直到有人处理它或者它从最终节目开始。

另一方面,信号是公开发出的,任何其他实体都可以选择连接并收听它们。它们通过事件循环并在队列中处理(如果它们在同一个线程中,也可以直接处理它们)。

答案 3 :(得分:2)

我对这种差异的印象如下:

enter image description here

假设你有一个服务器设备,运行无限循环,监听一些外部客户端事件并通过执行一些代码对它们做出反应。

(它可以是CPU,侦听来自设备的中断,或客户端Javascript浏览器代码,点亮用户点击或服务器端网站代码,监听请求网页或数据的用户)。

或者它可以是你的Qt应用程序,运行它的主循环。

我将假设您在Linux上运行Qt并使用用于绘图的X服务器进行解释。

我可以区分两个主要区别,虽然第二个区别有点争议:

  1. 事件代表您的硬件并且是一个小的有限集。信号代表您的Widgets层逻辑,可以是任意复杂和众多的。
  2. 事件是来自客户端的低级别消息。事件集是一个严格限制的集(约20种不同的事件类型),由硬件决定(例如鼠标点击/双击/按下/释放,鼠标移动,键盘按键/释放/保持等),并在协议中指定应用程序和用户之间的交互(例如X协议)。

    E.g。在创建X协议的时候,没有多点触控手势,只有鼠标和键盘,所以X协议不会理解你的手势并将它们发送到应用程序,它只会将它们解释为鼠标点击。因此,随着时间推移引入X协议的扩展。

    X事件对窗口小部件一无所知,窗口小部件仅存在于Qt中。 X事件只知道X窗口,这些窗口是您的窗口小部件组成的非常基本的矩形。您的Qt事件只是X事件/ Windows事件/ Mac事件的一个薄包装,在不同的操作系统本机事件之间提供兼容层,以方便Widget级逻辑层作者。

    小部件级逻辑处理信号,因为它们包含操作的Widget级含义。此外,由于不同的事件,可以发射一个信号,例如鼠标点击"保存"菜单按钮或键盘快捷键,如Ctrl-S

    1. 抽象地说(这不完全是关于Qt!),事件本质上是异步的,而信号(或其他术语中的钩子)是同步的。
    2. 说,你有一个函数foo(),它可以触发Signal或发出Event。 如果它触发信号,信号在与函数相同的代码线程中执行,这导致它在函数之后。

      另一方面,如果它发出事件,事件将被发送到主循环,它取决于主循环,当它将该事件传递给接收方时,接下来会发生什么。 < / p>

      因此,2个连续事件甚至可能以相反的顺序传递,而2个连续发射的信号仍然是连续的。

      虽然术语不严格。 &#34;边界处理&#34;在Unix中作为进程间通信的一种手段应该更好地称为事件,因为它们是异步的:你在一个进程中调用一个信号,并且永远不知道,当事件循环将切换到接收进程并执行信号处理程序时。

      P.S。请原谅我,如果我的一些例子在字母方面不是绝对正确的话。他们在精神方面仍然很好。