GTK3 - 监控小部件发出的所有信号

问题描述 投票:0回答:2

有没有办法用 GTK3 监控小部件发出的所有信号?我知道

event
信号是在事件之前发出的,但我不确定 GTK 术语中“事件”和“信号”之间的区别 - 因为这似乎并没有捕获所有信号。

我知道 GDK 有一个功能

gdk_set_show_events
但这主要显示从操作系统发送到窗口的事件。有 GTK3 等效项吗?

gtk gdk
2个回答
1
投票

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

使用 g_signal_lookup 获取 gtype 的所有信号 ID。然后在实例的每个信号上使用 g_signal_add_emission_hook 来注册一个钩子,以便在发出特定信号时调用。在钩子函数内,通过

*ihint
为您提供信号 ID,其中 g_signal_query 应该为您提供打印调试消息所需的所有信息。 (我没有测试过,但应该可以)

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


0
投票

使用 g_signal_lookup 获取所有信号 ID

比描述的要复杂一些。为了使用g_signal_lookup,您首先需要一个信号名称。如果要监视独立于对象类型的每个信号,首先需要列出特定实例类型的所有信号。这可以通过 g_signal_list_ids 排列为一个 GType。要真正获得实例上发出的所有信号,您需要迭代该实例的所有父类型。您可以使用 g_type_parent 来完成此操作。

我自己构建了一些实用函数,这些函数提供此功能的目的与问题的目的相同。您可以使用 gemu_glib_util_connect_to_all_signals 将发射挂钩连接到 GObject 实例的所有信号,或者使用 gemu_gtk_util_signal_connect_to_widget_children 将发射挂钩连接到 GtkWidget 实例及其所有子实例。

© www.soinside.com 2019 - 2024. All rights reserved.