我使用Glade 3.18.3编辑了这个UI文件。我在(C)gtk程序中打开UI(这里没问题,没有错误消息)。
然后我尝试使用gtk_builder_get_object
从构建器对象中获取窗口小部件引用,但找不到任何内容。
我读到gtkbuilder用于将小部件的name
属性设置为id
,但不再这样做了。所以我在几个小部件中定义了name
,但这没有帮助。
在desesperation中,我添加了一个调用gtk_builder_get_objects
的简单循环,但此函数返回NULL:
GSList *lp, *lst = gtk_builder_get_objects(builder);
printf("%p\n", lst);
for (lp = lst; lp != NULL; lp = lp->next) {
printf("%s\n", (char *)(lp->data));
}
任何?
答案 0 :(得分:1)
您的示例具有误导性:您可能还有一些其他问题,即代码未显示。
以下测试用例使用完全相同的循环,但不返回NULL
。 ui文件没有在对象上设置任何name
。试试吧。
#include <gtk/gtk.h>
int main()
{
GtkBuilder *builder;
GSList *lp, *lst;
gtk_init(NULL, NULL);
builder = gtk_builder_new_from_file("test.ui");
lst = gtk_builder_get_objects(builder);
g_print("%p\n", lst);
for (lp = lst; lp != NULL; lp = lp->next) {
g_print("%p\n", (char *)(lp->data));
}
return 0;
}
这是test.ui
:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
答案 1 :(得分:0)
问题是包含小部件的窗口的name
属性必须也在UI中设置,否则gtk_builder_add_objects_from_file
也不会工作。
这将是一个令人头疼的问题。用户界面非常复杂(几百个小部件)。所以这意味着我必须在Glade中访问它们来编辑它们的name
...或者写一个脚本。这之前运作良好。