2

我正在使用 glade 制作我的 .ui 文件,然后使用GtkBuilder我将整个 .ui 文件加载到我的 C 程序中,因此所有小部件和东西都是从构建器文件本身创建的。

早些时候我只从代码本身创建小部件,因此允许我将任何类型的数据传递给回调,因为第二个参数是一个gpointer变量,我可以随时创建一个指向自定义结构的指针并将任何类型的数据传递给回调。

但现在要连接到信号,我只是使用这个简单的功能:

gtk_builder_connect_signals(builder, NULL);

builder指向的指针在哪里GtkBuilder

这将 glade 文件中提到的所有信号与 .c 文件中定义的函数的信号连接起来,除了 Widgets(它们本身只能在 glade 中定义)之外,没有任何传递 user_data 的规定。

谁能告诉我一个解决方案,以便我可以将任何类型的数据传递给我的回调。我不想离开 glade,因为它节省了我很多时间,因此我不想切换到仅通过代码创建小部件的传统方式。

同时使用 g_connect_signal() 和 gtk_builder_connect_signals() 的示例会有所帮助。在这种情况下,首先调用哪个来覆盖信号连接。

4

2 回答 2

1

您可以调用gtk_builder_get_object以检索由 Glade 给定的小部件名称创建的任何小部件。g_connect_signal然后,您可以使用通常的API将小部件连接到信号。缺点是您不能再简单地“提及”林间空地定义中的信号。

另一种方法是也用于gtk_builder_get_object获取对象,但调用g_object_set_qdata以将必要的用户数据与GQuark您已知的密钥相关联。然后,您的回调可以使用g_object_get_qdata相同的键从小部件中获取用户数据。这样做的好处是您仍将使用gtk_builder_connect_signals.

于 2013-04-07T15:38:41.980 回答
1

您传入的 NULL 指针用于用户数据指针。

gtk_builder_connect_signals(builder, NULL);
                                      ^
here----------------------------------|

如果您始终拥有相同的用户数据对象,那么您的问题就解决了。如果不是,您将需要针对不同用户数据指针的某种数据结构,以便每个回调都可以找到正确的。

于 2019-06-12T14:35:06.637 回答