使用glade将用户数据传递给回调函数

时间:2013-04-07 06:14:44

标签: c gtk glade

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

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

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

gtk_builder_connect_signals(builder, NULL);

其中builder是指向GtkBuilder的指针。

这将glade文件中提到的所有信号与.c文件中定义的函数连接起来,而不提供任何传递user_data而不是Widgets的信息(它们本身只能在glade中定义。)

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

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

2 个答案:

答案 0 :(得分:0)

您可以调用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

答案 1 :(得分:0)

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

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

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