0

有什么方法可以使用 GTK3 监控从小部件发出的所有信号?我知道event信号是在事件之前发出的,但我不确定 GTK 术语中“事件”和“信号”之间的区别——因为这似乎不能捕获所有信号。

我知道 GDK 有一个功能gdk_set_show_events,但这主要显示从操作系统发送到窗口的事件。有GTK3等价物吗?

4

2 回答 2

1

没有内置函数 AFAIK,但我相信你可以自己破解一些东西:

使用g_signal_lookup获取 gtype 的所有信号 ID。然后在实例的每个信号上使用g_signal_add_emission_hook来注册一个挂钩,以便在发出该特定信号时调用。在钩子函数中,通过 为您提供了信号 id *ihintg_signal_query应该从中为您提供打印调试消息所需的所有信息。(我没有测试它,但它应该工作)

请注意,不幸的是,这不适用于使用 G_SIGNAL_NO_HOOKS 定义的信号。

于 2013-03-01T11:27:02.497 回答
0

使用g_signal_lookup获取所有信号 id

它比描述的要复杂一些。为了使用g_signal_lookup,您首先需要一个信号名称。如果要独立于对象类型监控每个信号,首先需要列出特定实例类型的所有信号。这可以由g_signal_list_ids为一个GType安排。要获得实例上真正发出的所有信号,您需要遍历此实例的所有父类型。您可以使用g_type_parent来做到这一点。

我自己构建了一些实用程序功能,它们提供此功能用于与问题相同的调试目的。您可以使用 gemu_glib_util_connect_to_all_signals 为GObject实例的所有信号连接 Emission-Hook,或者使用gemu_gtk_util_signal_connect_to_widget_children将 Emission-Hook连接到GtkWidget实例及其所有子代

于 2017-03-14T12:28:52.883 回答