Spec-Zone.ru › GTK 3.20

Создание пользовательских интерфейсов

При создании более сложного пользовательского интерфейса, содержащего десятки или сотни виджетов, выполнение всей настройки в коде C неудобно, а внесение изменений становится практически невозможным.

К счастью, GTK+ поддерживает разделение макета пользовательского интерфейса и вашей бизнес-логики с помощью описаний пользовательского интерфейса в формате XML, которые могут быть обработаны классом GtkBuilder.

Пример 3. Упаковка кнопок с помощью GtkBuilder

Создайте новый файл с таким содержимым, назвав его example-4.c.

#include <gtk/gtk.h>

static void
print_hello (GtkWidget *widget,
             gpointer   data)
{
  g_print ("Hello World\n");
}

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);

  /* Connect signal handlers to the constructed widgets. */
  window = gtk_builder_get_object (builder, "window");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  button = gtk_builder_get_object (builder, "button1");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);

  button = gtk_builder_get_object (builder, "button2");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);

  button = gtk_builder_get_object (builder, "quit");
  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), 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>

Вы можете скомпилировать программу выше с помощью GCC, используя:

gcc `pkg-config --cflags gtk+-3.0` -o example-4 example-4.c `pkg-config --libs gtk+-3.0`

Обратите внимание, что GtkBuilder также может использоваться для создания объектов, которые не являются виджетами, таких как модели дерева, настройки и т. д. Именно поэтому используемый здесь метод называется gtk_builder_get_object() и возвращает GObject* вместо GtkWidget*.

Обычно вы передаете полный путь к gtk_builder_add_from_file(), чтобы сделать выполнение вашей программы независимым от текущей директории. Общим местом для установки описаний пользовательского интерфейса и подобных данных является /usr/share/appname.

Также возможно встроить описание пользовательского интерфейса в исходный код в виде строки и использовать gtk_builder_add_from_string() для его загрузки. Но сохранение описания пользовательского интерфейса в отдельном файле имеет несколько преимуществ: тогда можно вносить небольшие изменения в пользовательский интерфейс без перекомпиляции вашей программы, и, что более важно, графические редакторы пользовательского интерфейса, такие как glade, могут загрузить этот файл и позволить вам создавать и изменять свой пользовательский интерфейс с помощью метода «наведи и щелкни».

© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer.gnome.org/gtk3/3.20/ch01s03.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API