【问题标题】:Passing user data to Callback function using glade使用 glade 将用户数据传递给回调函数
【发布时间】:2013-04-07 06:14:43
【问题描述】:

我正在使用 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() 的示例会有所帮助。在这种情况下,首先调用哪个来覆盖信号连接。

【问题讨论】:

    标签: c gtk glade


    【解决方案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

    【讨论】:

      【解决方案2】:

      您传入的那个 NULL 指针是 for 用户数据指针。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多