C 使用glade将用户数据传递给回调函数
我使用glade创建.ui文件,然后使用C 使用glade将用户数据传递给回调函数,c,gtk,glade,C,Gtk,Glade,我使用glade创建.ui文件,然后使用GtkBuilder将整个.ui文件加载到我的C程序中,因此所有小部件和内容都是从生成器文件本身创建的 早些时候,我只从代码本身创建小部件,因此允许我向回调传递任何类型的数据,因为第二个参数是gpointer变量,我可以随时创建指向自定义结构的指针,并向回调传递任何类型的数据 但现在要连接到信号,我只使用这个简单的函数: gtk_builder_connect_signals(builder, NULL); 其中builder是指向GtkBuilder的
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----------------------------------|
如果您总是有相同的用户数据对象,那么您的问题就解决了。如果不是你
对于不同的用户数据指针,需要某种数据结构,以便
每个回调都可以找到正确的回调