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

C 使用glade将用户数据传递给回调函数,c,gtk,glade,C,Gtk,Glade,我使用glade创建.ui文件,然后使用GtkBuilder将整个.ui文件加载到我的C程序中,因此所有小部件和内容都是从生成器文件本身创建的 早些时候,我只从代码本身创建小部件,因此允许我向回调传递任何类型的数据,因为第二个参数是gpointer变量,我可以随时创建指向自定义结构的指针,并向回调传递任何类型的数据 但现在要连接到信号,我只使用这个简单的函数: gtk_builder_connect_signals(builder, NULL); 其中builder是指向GtkBuilder的

我使用glade创建.ui文件,然后使用
GtkBuilder
将整个.ui文件加载到我的C程序中,因此所有小部件和内容都是从生成器文件本身创建的

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

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

gtk_builder_connect_signals(builder, NULL);
其中
builder
是指向
GtkBuilder
的指针

这将glade文件中提到的所有信号与.c文件中定义的函数的信号连接起来,而不提供任何传递用户_数据的功能,除了小部件的数据(小部件本身只能在glade中定义)

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


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

您可以调用
gtk\u builder\u get\u object
来检索Glade根据小部件名称创建的任何小部件。然后,您可以使用通常的
g\u connect\u signal
API将小部件连接到信号。缺点是,您不能再简单地在glade定义中“提及”信号


另一种方法是也使用
gtk\u builder\u get\u object
获取对象,但调用
g\u object\u set\u qdata
将必要的用户数据与已知的
GQuark
键关联。然后,您的回调可以使用相同的键使用
g\u object\u get\u qdata
从小部件拾取用户数据。这样做的好处是,您仍将使用
gtk\u builder\u connect\u signals

传递的空指针是用户数据指针的

gtk_builder_connect_signals(builder, NULL);
                                      ^
here----------------------------------|
如果您总是有相同的用户数据对象,那么您的问题就解决了。如果不是你 对于不同的用户数据指针,需要某种数据结构,以便 每个回调都可以找到正确的回调