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

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


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


在我看来,GDK使用“事件”,而GTK +使用“信号”。也许事件只是被打包成信号,或者相反?还是它们完全不同?

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

我的理解正确吗?

此外,在文档中,有时信号以双冒号(::event)开头,有时则不是(key-press-eventevent-after)。有什么区别?双冒号是什么意思?

最佳答案

这只是术语。

在GObject中,信号只是调用命名函数列表的一种奇特方法;每次实例“发出”信号时,GSignal机制都会查看与该特定信号相关的所有回调,并顺序调用它们,直到满足以下任一条件:


回调列表已用尽
如果满足定义的条件,则定义信号时使用的信号累加器将停止信号发射链


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

在GDK中,事件是与窗口系统事件相关的结构,例如按钮按下,键释放,越过窗口边界的指针,窗口层次结构的更改等等。通常,您与GDK事件的唯一交互发生在GtkWidget类型的特定信号上。按照惯例(尽管并不总是适用),具有GdkEvent结构的信号具有-event后缀,例如button-press-eventkey-release-evententer-notify-eventwindow-state-event。同样,这些是GObject信号,它们的唯一专长是使用GdkEvent作为参数。

至于双冒号:信号的完整规格由声明它的类型组成,例如GtkWidget,以及信号名称,例如button-press-event,由双冒号分隔,例如GtkWidget::button-press-event::button-press-event表示法只是文档的简写形式,表示发言者指的是button-press-event信号。

关于gtk - 在GTK中,“信号”和“事件”之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24782062/

10-17 01:29