Файлы пользовательского интерфейса не отображают свои виджеты для gtk_builder_get_objects
У меня есть этот файл пользовательского интерфейса, отредактированный с помощью Glade 3.18.3. Я открываю пользовательский интерфейс в программе (C) GTK (здесь нет проблем, нет сообщений об ошибках).
Затем я попытался получить ссылки на виджеты из объекта построителя, используя 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));
}
Кто-нибудь?
2 ответа
Ваш пример вводит в заблуждение: у вас, вероятно, есть другая проблема, которую ваш код не показывает.
Следующий тестовый пример использует тот же цикл и не возвращает 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>
Проблема заключалась в том, что name
свойство окна, содержащего виджеты, также должно быть установлено в пользовательском интерфейсе, иначе gtk_builder_add_objects_from_file
тоже не сработает.
Это будет большая головная боль. Пользовательский интерфейс довольно сложный (пара сотен виджетов). Так что это значит, что я должен навестить их всех на поляне, чтобы отредактировать их name
... или, может быть, написать сценарий. И это работало так хорошо раньше.