我正在尝试使用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事件调用窗口小部件的回调函数(不是程序员干扰)。然后,回调函数依次发出三个信号::event
,key-press-event
和event-after
。作为程序员,我可以通过编写回调函数来拦截这些信号。如果第一个::event
信号的回调返回TRUE
,则不会触发第二个key-press-event
信号,否则会触发。第三个event-after
信号总是被触发。
我的理解是否正确?
此外,在文档中,有时信号以双冒号(::event
)为前缀,有时它们不是(key-press-event
和event-after
)。有什么不同?双结肠是什么意思?
答案 0 :(得分:6)
它只是命名法。
在GObject中,信号只是调用命名的函数列表的奇特方式;每次实例"发出"一个信号,GSignal机器将查看连接到该特定信号的所有回调,并按顺序调用它们,直到满足以下任一条件:
GDK或GTK +(以及任何其他基于GObject的库)发出的所有信号都以这种方式工作。
GDK中的事件是与窗口系统事件相关的结构,例如按钮按下,键释放,跨越窗口边界的指针,窗口层次结构的变化等等。您通常与GDK事件进行的唯一交互发生在GtkWidget
类型的特定信号中。作为约定(尽管并不总是适用),具有GdkEvent
结构的信号具有-event
后缀,如button-press-event
或key-release-event
或{{1} },或enter-notify-event
。再一次,那些是GObject信号,他们唯一的专业是以window-state-event
为参数。
对于双冒号:信号的完整规范由声明它的类型组成,例如: GdkEvent
和信号名称,例如GtkWidget
,用双结肠隔开,例如button-press-event
。 GtkWidget::button-press-event
表示法只是一种文档简写,表示发言者指的是::button-press-event
信号。
答案 1 :(得分:2)
理解它的简单方法是,事件是你对一个对象做的事情,比如GtkButton(我们选择按钮作为你可以看到的东西)。当你单击一个按钮时,按钮会从你那里收到一个事件(实际上是来自Gdk(gtk与底层窗口和图形系统之间的一个薄层)。收到一个事件后,它必须做一些事情。否则它就是一个死对象。
从那里,必须要做一些事情。由于物体必须做某事,所以其余的信号将会接收。信号将从“对象”发出,告诉其他对象发生了什么。简而言之,信号是事件的捕手。 GtkButton最常用的预定义信号是“点击”。在信号的回调中,你可以做任何你想做的事。
现在,另一个问题,嘿,为什么我们不从鼠标按钮抓住事件并从那里开始呢?当然可以。方法如下:
接下来,Gdk也使用信号。例如,GdkScreen会发出3个信号,这些信号会从事件中作出反应:不知何故,您关闭了合成窗口,不知何故,您将与其他屏幕连接,并以某种方式更改屏幕分辨率。
接下来,回调不是发出的信号。信号“发出”回调。如果您要连接(在您的学期中截取),则由您自行决定。它不是你的功能,它是预定义的功能,你只需用你的功能名称包裹它。使用信号后,您也可以出于某种原因断开连接。
接下来,是的,如果小部件信号“event”返回True,则第二个特定信号被断开。注意:不要篡改窗口小部件的事件掩码,因为窗口小部件有自己的默认事件掩码。
最后,双结肠?要么是像双冒号这样的记录,要么就是说这个信号属于一个类。不要担心,你可能不会在C
中使用它