信号函数
连接和断开信号处理函数
gulong g_signal_connect( GObject *object,
const gchar *name,
GCallback func,
gpointer func_data );
gulong g_signal_connect_after( GObject *object,
const gchar *name,
GCallback func,
gpointer func_data );
gulong g_signal_connect_swapped( GObject *object,
const gchar *name,
GCallback func,
GObject *slot_object );
void g_signal_handler_disconnect( GObject *object,
gulong handler_id );
void g_signal_handlers_disconnect_by_func( GObject *object,
GCallback func,
gpointer data );
阻塞和反阻塞信号处理函数
void g_signal_handler_block( GObject *object,
gulong handler_id);
void g_signal_handlers_block_by_func( GObject *object,
GCallback func,
gpointer data );
void g_signal_handler_unblock( GObject *object,
gulong handler_id );
void g_signal_handler_unblock_by_func( GObject *object,
GCallback func,
gpointer data );
发出和停止信号
void g_signal_emit( GObject *object,
guint signal_id,
... );
void g_signal_emit_by_name( GObject *object,
const gchar *name,
... );
void g_signal_emitv( const GValue *instance_and_params,
guint signal_id,
GQuark detail,
GValue *return_value );
void g_signal_stop_emission( GObject *object,
guint signal_id,
GQuark detail );
void g_signal_stop_emission_by_name( GObject *object,
const gchar *detailed_signal );
信号的发射和传播
信号发射是 GTK 为指定的对象和信号运行所有处理函数的过程。
首先,注意从信号发射返回的值是最后一个处理函数执行后返回的值。因为所有事件信号都是 GTK_RUN_LAST 类型,GTK 提供的处理函数将成为默认处理函数,除非你用 gtk_signal_connect_after() 设置连接。
一个事件 (如”button_press_event”) 的处理过程是:
- 从事件发生的构件开始。
- 发出通常的 “event” 信号。如果信号处理函数返回 TRUE 值,停止所有的处理。
- 否则,发出一个指定的,”button_press_event” 信号。如果它返回 TRUE,停止所有的处理。
- 否则,转到父构件,重复前两步。
- 继续直到某些信号处理函数返回 TRUE,或者直到达到了最顶层的构件。
上述问题的一些重点是:
- 如果信号有一个默认的处理函数,那么你的处理函数返回的值不起作用,除非你用 gtk_signal_connect_after() 设置连接。(译者注:这是因为默认处理函数最后运行,而信号发射的返回值取最后一个处理函数的返回值。)
- 为了阻止默认的信号处理函数运行,你需要用 gtk_signal_connect() 设置连接,并使用 gtk_signal_emit_stop_by_name() - 返回值只影响信号是否传播,不影响当前信号的发射。(译者注:也就是说,gtk_signal_emit_stop_by_name() 才影响信号的发射。停止发射,就使连接到这个信号的其它函数不继续被调用。)