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

时间:2014-07-16 13:26:33

标签: gtk gobject

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

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

  

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

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

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

我的理解是否正确?

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

2 个答案:

答案 0 :(得分:6)

它只是命名法。

在GObject中,

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

  1. 回调列表已用尽
  2. 定义信号时使用的信号累加器将在满足定义条件时停止信号发射链
  3. GDK或GTK +(以及任何其他基于GObject的库)发出的所有信号都以这种方式工作。

    GDK中的

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

    对于双冒号:信号的完整规范由声明它的类型组成,例如: GdkEvent和信号名称,例如GtkWidget,用双结肠隔开,例如button-press-eventGtkWidget::button-press-event表示法只是一种文档简写,表示发言者指的是::button-press-event信号。

答案 1 :(得分:2)

理解它的简单方法是,事件是你对一个对象做的事情,比如GtkButton(我们选择按钮作为你可以看到的东西)。当你单击一个按钮时,按钮会从你那里收到一个事件(实际上是来自Gdk(gtk与底层窗口和图形系统之间的一个薄层)。收到一个事件后,它必须做一些事情。否则它就是一个死对象。

从那里,必须要做一些事情。由于物体必须做某事,所以其余的信号将会接收。信号将从“对象”发出,告诉其他对象发生了什么。简而言之,信号是事件的捕手。 GtkButton最常用的预定义信号是“点击”。在信号的回调中,你可以做任何你想做的事。

现在,另一个问题,嘿,为什么我们不从鼠标按钮抓住事件并从那里开始呢?当然可以。方法如下:

  1. 获取窗口中按钮的位置
  2. 计算内存中分配的宽度,高度和位置,所以当用户发出事件按钮时按下,会触发一些事情
  3. 制作另一个功能,当您调整大小,最小化,最大化窗口,再次计算位置,宽度和高度并将其保留在内存中。还有其他小部件,因为它们的大小也在变化。
  4. 如果您选择不显示小部件,请计算窗口中的每个小部件,因为它们的位置,宽度和高度完全不同,请将其存储在内存中。
  5. 如果你移动窗口或窗口是隐藏的,不要做任何事情,因为按钮的坐标被顶部的其他东西替换。你不想点击屏幕(按钮所在的位置),你的应用程序会在其他窗口聚焦时执行某些操作。 如果你松开你的鼠标?................该死的
  6. 接下来,Gdk也使用信号。例如,GdkScreen会发出3个信号,这些信号会从事件中作出反应:不知何故,您关闭了合成窗口,不知何故,您将与其他屏幕连接,并以某种方式更改屏幕分辨率。

    接下来,回调不是发出的信号。信号“发出”回调。如果您要连接(在您的学期中截取),则由您自行决定。它不是你的功能,它是预定义的功能,你只需用你的功能名称包裹它。使用信号后,您也可以出于某种原因断开连接。

    接下来,是的,如果小部件信号“event”返回True,则第二个特定信号被断开。注意:不要篡改窗口小部件的事件掩码,因为窗口小部件有自己的默认事件掩码。

    最后,双结肠?要么是像双冒号这样的记录,要么就是说这个信号属于一个类。不要担心,你可能不会在C

    中使用它