Spec-Zone.ru › GTK 4.0

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

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

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

Установка кнопок с помощью GtkBuilder

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

#include <gtk/gtk.h>
#include <glib/gstdio.h>

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

static void
quit_cb (GtkWindow *window)
{
  gtk_window_close (window);
}

static void
activate (GtkApplication *app,
          gpointer        user_data)
{
  /* Construct a GtkBuilder instance and load our UI description */
  GtkBuilder *builder = gtk_builder_new();
  gtk_builder_add_from_file (builder, "builder.ui", NULL);

  /* Connect signal handlers to the constructed widgets. */
  GObject *window = gtk_builder_get_object (builder, "window");
  gtk_window_set_application (GTK_WINDOW (window), app);

  GObject *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_swapped (button, "clicked", G_CALLBACK (quit_cb), window);

  gtk_widget_show (GTK_WIDGET (window));

  /* We do not need the builder any more */
  g_object_unref (builder);
}

int
main (int   argc,
      char *argv[])
{
#ifdef GTK_SRCDIR
  g_chdir (GTK_SRCDIR);
#endif

  GtkApplication *app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);

  int status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

Создайте новый файл с указанным ниже содержимым и именем builder.ui.

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <object id="window" class="GtkWindow">
    <property name="title">Grid</property>
    <child>
      <object id="grid" class="GtkGrid">
        <child>
          <object id="button1" class="GtkButton">
            <property name="label">Button 1</property>
            <layout>
              <property name="column">0</property>
              <property name="row">0</property>
            </layout>
          </object>
        </child>
        <child>
          <object id="button2" class="GtkButton">
            <property name="label">Button 2</property>
            <layout>
              <property name="column">1</property>
              <property name="row">0</property>
            </layout>
          </object>
        </child>
        <child>
          <object id="quit" class="GtkButton">
            <property name="label">Quit</property>
            <layout>
              <property name="column">0</property>
              <property name="row">1</property>
              <property name="column-span">2</property>
            </layout>
          </object>
        </child>
      </object>
    </child>
  </object>
</interface>

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

gcc `pkg-config --cflags gtk4` -o example-3 example-3.c `pkg-config --libs gtk4`

Обратите внимание, что 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-old.gnome.org/gtk4/4.0/ch01s05.html

Spec-Zone.ru

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