Файлы пользовательского интерфейса не отображают свои виджеты для 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... или, может быть, написать сценарий. И это работало так хорошо раньше.

Другие вопросы по тегам