有一种方法可以通过窗口小部件模板中的窗口小部件ID进行查找吗?
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。
答案 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中定义的处理程序信号。