在窗口小部件模板中按窗口小部件ID查找

时间:2014-07-05 01:56:16

标签: gtk3

有一种方法可以通过窗口小部件模板中的窗口小部件ID进行查找吗?

“widget template”我的意思是gtk_widget_class_set_template_from_resource

我尝试在窗口类中定义以下函数:

GtkWidget *
lookup_widget (CustomAppWindow *win,
               const char      *name)
{
    return GTK_WIDGET (gtk_widget_get_template_child (GTK_WIDGET (win),
                                                      GTK_TYPE_WIDGET,
                                                      name));
}

gtk_widget_get_template_child始终返回null。

1 个答案:

答案 0 :(得分:2)

调用gtk_widget_get_template_child()永远不应该返回NULL - 但你应该很少在第一时间调用该函数。

访问使用GTK小部件模板定义的对象的正确方法是使用与XML定义中相同的名称向实例数据结构添加成员,然后调用gtk_widget_class_bind_template_child()

例如,给出以下XML描述:

<interface>
  <template class="FooWidget" parent="GtkBox">
    <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
    <property name="spacing">4</property>
    <child>
      <object class="GtkButton" id="hello_button">
        <property name="label">Hello World</property>
        <signal name="clicked" handler="hello_button_clicked" object="FooWidget" swapped="yes"/>
      </object>
    </child>
    <child>
      <object class="GtkButton" id="goodbye_button">
        <property name="label">Goodbye World</property>
      </object>
    </child>
  </template>
</interface>

创建窗口小部件实例时,通常会在实例数据结构中添加两个GtkWidget成员,例如:

typedef struct _FooWidget {
    GtkBox parent_instance;

    GtkWidget *hello_button;
    GtkWidget *goodbye_button;
} FooWidget;
从您的类初始化函数

,您必须在设置模板后调用gtk_widget_class_bind_template_child()函数:

static void
foo_widget_class_init (FooWidgetClass *klass)
{
  // ...
  gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass),
                                               "/com/example/foo/widget.ui");
  gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass),
                                        FooWidget, hello_button);
  gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass),
                                        FooWidget, goodbye_button);
}

GTK +中的模板机制将确保在实例初始化时设置字段,并在实例终结时取消设置。这意味着您可以在调用gtk_widget_init_template()后立即从实例init访问这些字段:

static void
foo_widget_init (FooWidget *self)
{
  gtk_widget_init_template (GTK_WIDGET (self));

  // now you can access self->hello_button and self->goodbye_button
}

如果您没有编写应用程序,或者想要从实例结构中隐藏组合窗口小部件的组件,则可以使用私有结构并调用gtk_widget_class_bind_template_private_child()

请记住,您还可以使用gtk_widget_class_bind_template_callback()将本地范围中定义的函数绑定到XML中定义的处理程序信号。