GtkBuilder игнорирует файл .ui - PullRequest
       10

GtkBuilder игнорирует файл .ui

4 голосов
/ 06 февраля 2012

Я пытаюсь создать действительно простой графический интерфейс, используя GtkBuilder и glade.Чтобы достичь этого, я следую официальному руководству по Gtk + 3.Единственное отличие от исходного кода состоит в том, что я не подключаюсь к сигналам виджета для простоты (и поэтому также удалил их функцию обратного вызова):

#include <gtk/gtk.h>

int
main (int   argc,
      char *argv[])
{
  GtkBuilder *builder;
  GObject *window;
  GObject *button;

  gtk_init (&argc, &argv);

  /* Construct a GtkBuilder instance and load our UI description */
  builder = gtk_builder_new ();
  gtk_builder_add_from_file (builder, "builder.ui", NULL);


  gtk_main ();

  return 0;
}

Файл "builder.ui", используемый в руководствевыглядит так:

        <interface>
  <object id="window" class="GtkWindow">
    <property name="visible">True</property>
    <property name="title">Grid</property>
    <property name="border-width">10</property>
    <child>
      <object id="grid" class="GtkGrid">
        <property name="visible">True</property>
        <child>
          <object id="button1" class="GtkButton">
            <property name="visible">True</property>
            <property name="label">Button 1</property>
          </object>
          <packing>
            <property name="left-attach">0</property>
            <property name="top-attach">0</property>
          </packing>
        </child>
        <child>
          <object id="button2" class="GtkButton">
            <property name="visible">True</property>
            <property name="label">Button 2</property>
          </object>
          <packing>
            <property name="left-attach">1</property>
            <property name="top-attach">0</property>
          </packing>
        </child>
        <child>
          <object id="quit" class="GtkButton">
            <property name="visible">True</property>
            <property name="label">Quit</property>
          </object>
          <packing>
            <property name="left-attach">0</property>
            <property name="top-attach">1</property>
            <property name="width">2</property>
          </packing>
        </child>
      </object>
      <packing>
      </packing>
    </child>
  </object>
</interface>

… и не вызывает никаких проблем.Программа компилирует и выдает нужное окно.Однако, когда я пытаюсь использовать свой собственный файл .ui (сгенерированный glade 3.10.0), я не получаю никакого результата.Приложение входит в основной цикл, и окно не появляется.Файл GUI, который я использую:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="Window">
    <property name="can_focus">False</property>
    <property name="border_width">15</property>
    <child>
      <object class="GtkLabel" id="fooLabel">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes">foobar</property>
      </object>
    </child>
  </object>
</interface>

Что я делаю не так?

Ответы [ 4 ]

5 голосов
/ 06 февраля 2012

Вы читаете только XML-файл, вам понадобится код, который манипулирует пользовательским интерфейсом, например, показывает окно верхнего уровня в вашем .ui:

int main (int   argc, char *argv[])
{
  GtkBuilder      *builder; 
  GtkWidget       *window;

  gtk_init (&argc, &argv);

  builder = gtk_builder_new ();
  gtk_builder_add_from_file (builder, "tutorial.xml", NULL);
  window = GTK_WIDGET (gtk_builder_get_object (builder, "Window"));
  g_object_unref (G_OBJECT (builder));
  gtk_widget_show (window);                
  gtk_main ();

  return 0;
}
4 голосов
/ 07 февраля 2012

Разница между вашим UI-файлом и учебным UI-файлом заключается в следующей строке в виджете GtkWindow:

<property name="visible">True</property>

Без этого ваше окно (и все, что внутри него) остается скрытым, поэтому"ничего не случилось.Окно было там, оно было просто невидимым.Строка

gtk_widget_show (window);

в nos 'Solution также решает проблему, но именно поэтому учебный файл сработал, а ваш - нет.

0 голосов
/ 05 октября 2015

У меня была такая же проблема.Простое приложение, которое отображает нормально на Ubuntu Linux, не появилось в Raspbian.После некоторой отладки похоже, что реализация GTKBuilder для Raspbian содержит ошибку.Это не работает.

Решение: 1) Либо вручную преобразуйте XML-описание GUI в вызовы API C / C ++ (GTK +).ИЛИ 2) Напишите небольшую программу для преобразования XML-файла GUI в вызовы API C / C ++ (GTK +).

Спасибо.

0 голосов
/ 14 января 2015

У меня была такая же проблема, но я все безуспешно пытался выполнить все вышеперечисленное.

Я привык к C ++ в Windows, но это проект g ++ на raspbian для raspberry pi.

Мое единственное решение до сих пор состояло в том, чтобы добавить полный путь следующим образом

gtk_builder_add_from_file (builder, "/home/pi/Documents/tutorial.xml", NULL);

Впоследствии я включил путь в компилятор, но затем снова не было окна.

...