Arn*_*nce 11
一个事件是一个消息封装在一个类(QEvent),其是在事件循环处理,并分派到接收方可以接受的消息或通过它沿给他人来处理.它们通常是为响应鼠标点击等外部系统事件而创建的.
信号和插槽是QObjects彼此通信的便捷方式,与回调函数更相似.在大多数情况下,当发出"信号"时,直接调用连接到它的任何插槽功能.例外情况是信号和插槽跨越线程边界.在这种情况下,信号将基本上转换为事件.
事件是事情发生到或内的对象.通常,您可以在对象自己的类代码中处理它们.
信号由对象发出.该对象基本上是通知其他对象发生了什么事.其他对象可能会做某事或不做,但这不是发射器的工作来处理它.
我对差异的印象如下:

假设你有一个服务器设备,运行一个无限循环,监听一些外部客户端事件并通过执行一些代码对它们做出反应。
(它可以是一个 CPU,监听来自设备的中断,或客户端 Javascript 浏览器代码,监听用户点击或服务器端网站代码,监听用户请求网页或数据)。
或者它可以是您的 Qt 应用程序,运行其主循环。
我将假设您在 Linux 上运行 Qt 并使用用于绘图的 X 服务器进行解释。
我可以区分两个主要差异,尽管第二个有些争议:
事件是来自客户端的低级消息。事件集是一个严格限制的集(约 20 种不同的事件类型),由硬件决定(例如鼠标单击/双击/按下/释放、鼠标移动、键盘按键按下/释放/按住等),并在协议中指定应用程序和用户之间的交互(例如 X 协议)。
例如,在创建 X 协议时,没有多点触控手势,只有鼠标和键盘,因此 X 协议不会理解您的手势并将其发送到应用程序,它只会将它们解释为鼠标点击。因此,随着时间的推移,引入了对 X 协议的扩展。
X 事件对小部件一无所知,小部件只存在于 Qt 中。X 事件只知道 X 窗口,它们是您的小部件组成的非常基本的矩形。您的 Qt 事件只是 X 事件/Windows 事件/Mac 事件的薄包装器,为不同操作系统本机事件之间提供了一个兼容层,以方便 Widget 级逻辑层作者。
Widget 级逻辑处理信号,因为它们包括您的操作的 Widget 级含义。此外,由于不同的事件,例如鼠标单击“保存”菜单按钮或键盘快捷键(例如 Ctrl-S ),可以触发一个信号。
假设您有一个函数 foo(),它可以触发信号或发出事件。如果它触发信号,Signal 将在与导致它的函数相同的代码线程中执行,紧跟在 function 之后。
另一方面,如果它发出 Event,则Event 被发送到主循环,它取决于主循环,何时将事件传递给接收方以及接下来会发生什么。
因此,2 个连续的事件甚至可能以相反的顺序传递,而 2 个连续发射的信号保持连续。
不过,术语并不严格。Unix 中作为进程间通信手段的“信号”应该更好地称为事件,因为它们是异步的:您在一个进程中调用信号并且永远不知道事件循环何时将切换到接收进程并执行信号处理程序.
PS请原谅我,如果我的一些例子在字母方面不是绝对正确的。他们在精神上仍然很好。
| 归档时间: |
|
| 查看次数: |
9868 次 |
| 最近记录: |