GLib
  • Initial page
  • I. Концепция
    • Background
    • Типы данных и программирование
  • Динамическая система типов Glib
    • Введение
    • Функции копирования
    • Соглашения
    • Неинстанциируемые не классифицированные базовые типы
    • Инстанциируемые классифицируемые типы: объекты
    • Неинстанциированные классифицированные типы: Интерфейсы.
  • Основной класс GObject
    • Введение
    • Инстанциация объекта
    • Объектное управление памятью
    • Свойства объекта
  • Система сообщений GObject
    • Замыкания
    • Сигналы
  • II. Описание API
    • GType
    • GTypePlugin
    • GTypeModule
    • GObject часть 1
    • GObject часть 2
    • Enums and Flags
    • GBoxed
    • Generic Values
    • Parameters and Values часть 1
    • Parameters and Values часть 2
    • Parameters and Values часть 3, ага
    • Value arrays
  • III. Описание инструментов
    • glib-mkenums
    • glib-genmarshal
    • gobject-query
  • IV. Руководство
    • Как определить и реализовать новый GObject?
    • Объектные методы
    • Как определять и реализовывать Интерфейсы?
    • Как создавать и использовать сигналы
    • Как пользователи могут злоупотреблять сигналами (и почему некоторые думают что это хорошо)
  • V. Об инструментах
    • Об инструментах
  • GTK 4
    • GtkApplication и GtkApplicationWindow
    • Widgets
Powered by GitBook
On this page
  • GtkApplication
  • GtkApplication и g_application_run
  • Сигналы
  • GtkWindow и GtkApplicationWindow

Was this helpful?

  1. GTK 4

GtkApplication и GtkApplicationWindow

GtkApplication

GtkApplication и g_application_run

Обычно люди пишут программный код для создания приложений. Что за приложения? Приложения - это программное обеспечение, которое запускается с использованием библиотек, включая ОС, фреймворки и так далее. В программировании на Gtk4 GtkApplication - это объект, работающий в библиотеках GTK.

Основной способ написания GtkApplication следующий.

  • Создать объект GtkApplication

  • Запустить его

Это все. Очень просто. Ниже приведен код C, представляющий описанный выше сценарий.

#include <gtk/gtk.h>

int main(int argc, char **argv)
{
  GtkApplication *app;
  int stat;

  app = gtk_application_new("com.github.ToshioCP.pr1", G_APPLICATION_FLAGS_NONE);
  stat = g_application_run(G_APPLICATION(app), argc, argv);
  g_object_unref(app);
  return stat;
}

В первой строке написано, что эта программа включает файлы заголовков библиотек GTK. Функция main - это функция точки входа в приложение на языке C. Переменная appопределяется как указатель на GtkApplication, который на самом деле является структурой, в которой хранится информация о приложении. Функция gtk_application_newгенерирует объект GtkApplication и устанавливает его указатель на app. Смысл аргументов будет объяснен позже. Функция g_application_runвызывает объект GtkApplication, на который указывает app. (Мы часто говорим, что функция вызывает app. На самом деле, appэто не объект, а указатель на объект. Однако он простой и короткий, и, вероятно, не возникает путаницы)

Чтобы скомпилировать это, необходимо запустить следующую команду. pr1.c - это имя файла исходного кода C.

$ gcc `pkg-config --cflags gtk4` pr1.c `pkg-config --libs gtk4`

Компилятор C gcc генерирует исполняемый файл a.out. Давай запустим.

$ ./a.out

(a.out:13533): GLib-GIO-WARNING **: 15:30:17.449: Your application does not implement
g_application_activate() and has no handlers connected to the "activate" signal.
It should do one of these.
$ 

О, просто сообщение об ошибке. Но это сообщение об ошибке означает, что объект GtkApplication без сомнения был запущен. Теперь подумаем о сообщении в следующем подразделе.

Сигналы

Сообщение сообщает нам, что:

  1. Приложение GtkApplication не реализует g_application_activate().

  2. И у него нет обработчиков, подключенных к сигналу активации.

  3. Вам нужно решить хотя бы одну из этих проблем.

Эти две причины ошибки связаны с сигналами. Итак, сначала я вам что такое сигналы.

Сигнал испускается, когда что-то происходит. Например, создается окно, разрушается окно и так далее. Сигнал «activate» выдается при активации приложения. Если сигнал связан с функцией, которая называется обработчиком сигнала или просто обработчиком, тогда функция вызывается при испускании сигнала. Порядок следующий:

  1. Что-то происходит.

  2. Если это связано с определенным сигналом, то сигнал испускается.

  3. Если сигнал подключен к обработчику заранее, то он вызывается.

Сигналы определены в объектах. Например, сигнал «activate» принадлежит объекту GApplication, который является родительским объектом объекта GtkApplication. Объект GApplication является дочерним объектом объекта GObject. GObject - это верхний объект в иерархии всех объектов.

GObject -- GApplication -- GtkApplication
<---parent                      --->child

Дочерний объект наследует сигналы, функции, свойства и т.д. От своего родительского объекта. Итак, GtkApplication также имеет сигнал «activate».

Теперь мы можем решить проблему в pr1.c. Нам нужно подключить сигнал активации к обработчику. Мы используем функцию, g_signal_connectкоторая связывает сигнал с обработчиком.

#include <gtk/gtk.h>

static void
on_activate(GApplication *app, gpointer *user_data)
{
  g_print("GtkApplication is activated.\n");
}

int main(int argc, char **argv)
{
  GtkApplication *app;
  int stat;

  app = gtk_application_new("com.github.ToshioCP.pr2", G_APPLICATION_FLAGS_NONE);
  g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);
  stat = g_application_run(G_APPLICATION(app), argc, argv);
  g_object_unref(app);
  return stat;
}

Сначала мы определяем обработчик, on_activateкоторый просто отображает сообщение. В функции main, которую мы добавляем g_signal_connectраньше g_application_run. У функции g_signal_connectчетыре аргумента.

  1. Объект, которому принадлежит сигнал.

  2. Название сигнала.

  3. Функция-обработчик (также называемая обратным вызовом), которую нужно передать G_CALLBACK.

  4. Данные для передачи обработчику. Если данные не требуются, следует указать NULL.

Вы можете найти описание каждого сигнала в справочнике API. Например, сигнал «activate» находится в разделе GApplication справочника GIO API. Функция обработчика описана в этом разделе.

Давайте скомпилируем исходный файл выше ( pr2.c) и запустим его.

$ gcc `pkg-config --cflags gtk4` pr2.c `pkg-config --libs gtk4`
$ ./a.out
GtkApplication is activated.
$ 

Вы могли заметить, что набирать такую ​​длинную строку для компиляции болезненно. Для решения этой проблемы рекомендуется использовать сценарий оболочки. Создайте текстовый файл, содержащий следующую строку.

gcc `pkg-config --cflags gtk4` $1.c `pkg-config --libs gtk4`

Затем сохраните его в каталоге $ HOME/bin, обычно это /home/(имя пользователя)/bin. (Если ваше имя пользователя Джеймс, тогда каталог будет /home/james/bin). И включите бит выполнения файла. Предположим, что имя файла - compэто следующая процедура.

$ chmod 755 $HOME/bin/comp
$ ls -log $HOME/bin
    ...  ...  ...
-rwxr-xr-x 1   62 May 23 08:21 comp
    ...  ...  ...

Если вы впервые создаете каталог $ HOME/bin и сохраняете в нем файл, вам необходимо выйти из системы и снова войти в систему.

$ comp pr2
$ ./a.out
GtkApplication is activated.
$ 

GtkWindow и GtkApplicationWindow

GtkWindow

Вывод сообщения «GtkApplication is activated» было создано в предыдущем подразделе. Это было хорошо с точки зрения теста GtkApplication. Однако этого недостаточно, поскольку GTK представляет собой основу для графического пользовательского интерфейса (GUI). Теперь мы продолжаем добавлять окно в эту программу. Что нам нужно сделать:

  1. Создать GtkWindow.

  2. Подключить его к GtkApplication.

  3. Показать окно.

Теперь перепишите функцию on_activate.

Создать GtkWindow

static void
on_activate(GApplication *app, gpointer user_data)
{
  GtkWidget *win;

  побед = gtk_window_new();
  gtk_window_set_application(GTK_WINDOW(победа), GTK_APPLICATION(приложение));
  gtk_widget_show(выигрыш);
}

Виджет - это абстрактное понятие, которое включает в себя все интерфейсы графического интерфейса пользователя, такие как окна, диалоговые окна, кнопки, текст, контейнеры и так далее. А GtkWidget - это базовый объект, от которого происходят все объекты графического интерфейса.

parent <-----> child
GtkWidget -- GtkWindow

GtkWindow включает GtkWidget в первой части объекта.

Функция gtk_window_newопределяется следующим образом.

GtkWidget *
 gtk_window_new ( void );

По этому определению он возвращает указатель на GtkWidget, а не на GtkWindow. Фактически он генерирует новый объект GtkWindow (не GtkWidget), но возвращает указатель на GtkWidget. Однако указатель указывает на GtkWidget, и в то же время он также указывает на GtkWindow, который содержит в себе GtkWidget.

Если вы хотите использовать winв качестве указателя на GtkWindow, вам необходимо его преобразовать.

(GtkWindow *) win

Или вы можете использовать GTK_WINDOWмакрос, который выполняет аналогичную функцию.

GTK_WINDOW (win)

Это рекомендуемый способ.

Подключите его к GtkApplication.

Функция gtk_window_set_applicationиспользуется для подключения GtkWindow к GtkApplication.

gtk_window_set_application (GTK_WINDOW (победа), GTK_APPLICATION (приложение));

Вам нужно привести win к GtkWindow и app GtkApplication. GTK_WINDOWи GTK_APPLICATIONмакросы подходят для этого.

GtkApplication продолжает работать до тех пор, пока соответствующее окно не будет уничтожено. Если вы не соединили GtkWindow и GtkApplication, GtkApplication немедленно отключится. Поскольку к GtkApplication не подключено ни одно окно, ему нет смысла продолжать работать. При выключении сгенерированное окно также уничтожается.

Покажи окно.

Функция gtk_widget_show используется для отображения окна.

Gtk4 изменил видимость виджета по умолчанию на true, поэтому каждому виджету не нужна эта функция, чтобы показывать себя. Но есть исключение. Верхнее окно (этот термин будет объяснен позже) не отображается, когда оно создается. Поэтому вам нужно использовать указанную выше функцию и показать окно.

Сохраните программу как, pr3.cскомпилируйте и запустите.

$ comp pr3
$ ./a.out

Появится небольшое окошко.

Нажмите кнопку закрытия, окно исчезнет, ​​и программа завершится.

GtkApplicationWindow

GtkApplicationWindow - дочерний объект GtkWindow. Он имеет некоторые дополнительные функции для лучшей интеграции с GtkApplication. При использовании GtkApplication рекомендуется использовать его вместо GtkWindow.

Теперь перепишите программу и используйте GtkAppliction Window.

static void
on_activate(GApplication *app, gpointer user_data)
{
  GtkWidget *win;

  win = gtk_application_window_new(GTK_APPLICATION(app));
  gtk_window_set_title(GTK_WINDOW(win), "pr4");
  gtk_window_set_default_size(GTK_WINDOW(win), 400, 300);
  gtk_widget_show(win);
}

Когда вы генерируете GtkApplicationWindow, вам нужно указать объект GtkApplication в качестве аргумента. Затем он автоматически соединяет эти два объекта. Так что звонить gtk_window_set_applicationбольше не нужно .

Программа устанавливает заголовок и размер окна по умолчанию. Скомпилируйте и запустите a.out, после чего вы увидите окно большего размера с заголовком «pr4».

PreviousОб инструментахNextWidgets

Last updated 4 years ago

Was this helpful?

Кроме того, g_signal_connectэто описано в справочнике GObject API. Ссылка на API очень важна. Вы должны это увидеть и понять, чтобы писать приложения GTK. Они находятся в .

GtkWindow и GtkWidget
Скриншот окна
Скриншот окна
«Центре разработчиков GNOME»