在GTK中,"信号"和"事件"之间有什么区别?

Jay*_*tor 4 gtk gobject

我正在尝试使用GTK,但我发现信号文档(https://developer.gnome.org/gobject/stable/signal.html)很难理解.

似乎"信号"和"事件"之间存在差异.例如,Widget的"事件" - 信号的文档(https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget-event)说

GTK +主循环将为每个传递给窗口小部件的GDK事件发出三个信号:一个generic :: event信号,另一个更具体的信号,与所传递的事件类型相匹配(例如"按键事件"),最后一个通用的"事件后"信号.

所以在我看来,GDK使用"事件",而GTK +使用"信号".也许事件只是包含在信号中,反之亦然?或者他们是完全不同的东西?

我对上述引用的理解:当按下某个键时,会触发GDK事件.此GDK事件调用窗口小部件的回调函数(不是程序员干扰).然后,回调函数依次发出三个信号::event,key-press-event并且event-after一个接一个地发出.作为程序员,我可以通过编写回调函数来拦截这些信号.如果第一个::event信号的回调返回TRUE,那么第二个key-press-event信号不会被触发,否则就是.第三个event-after信号总是被触发.

我的理解是否正确?

此外,在文档中,有时信号由双冒号(::event)前置,有时它们不是(key-press-eventevent-after).有什么不同?双结肠是什么意思?

eba*_*ssi 8

这只是命名法.

GObject中的信号只是调用命名函数列表的奇特方法; 每次实例"发出"一个信号时,GSignal机器将查看连接到该特定信号的所有回调,并按顺序调用它们,直到满足以下任一条件:

  1. 回调列表已用完
  2. 定义信号时使用的信号累加器将在满足定义条件时停止信号发射链

GDK或GTK +(以及任何其他基于GObject的库)发出的所有信号都以这种方式工作.

GDK中的事件是与窗口系统事件相关的结构,如按钮按下,键释放,跨越窗口边界​​的指针,窗口层次结构的变化等等.您通常与GDK事件的唯一交互发生在GtkWidget类型的特定信号中.作为惯例(虽然它并不总是适用)具有GdkEvent结构的信号具有-event后缀,例如button-press-event,或key-release-event,或enter-notify-event,或window-state-event.再一次,那些是GObject信号,他们唯一的专业是GdkEvent作为一个参数.

至于双冒号:信号的完整规范由声明它的类型组成,例如GtkWidget,信号名称,例如button-press-event,用双冒号分隔,例如GtkWidget::button-press-event.的::button-press-event符号仅仅是一个文档的简写,表示该扬声器被参照button-press-event信号.