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.
Компилятор C gcc генерирует исполняемый файл a.out. Давай запустим.
О, просто сообщение об ошибке. Но это сообщение об ошибке означает, что объект GtkApplication без сомнения был запущен. Теперь подумаем о сообщении в следующем подразделе.
Сигналы
Сообщение сообщает нам, что:
Приложение GtkApplication не реализует
g_application_activate().И у него нет обработчиков, подключенных к сигналу активации.
Вам нужно решить хотя бы одну из этих проблем.
Эти две причины ошибки связаны с сигналами. Итак, сначала я вам что такое сигналы.
Сигнал испускается, когда что-то происходит. Например, создается окно, разрушается окно и так далее. Сигнал «activate» выдается при активации приложения. Если сигнал связан с функцией, которая называется обработчиком сигнала или просто обработчиком, тогда функция вызывается при испускании сигнала. Порядок следующий:
Что-то происходит.
Если это связано с определенным сигналом, то сигнал испускается.
Если сигнал подключен к обработчику заранее, то он вызывается.
Сигналы определены в объектах. Например, сигнал «activate» принадлежит объекту GApplication, который является родительским объектом объекта GtkApplication. Объект GApplication является дочерним объектом объекта GObject. GObject - это верхний объект в иерархии всех объектов.
Дочерний объект наследует сигналы, функции, свойства и т.д. От своего родительского объекта. Итак, GtkApplication также имеет сигнал «activate».
Теперь мы можем решить проблему в pr1.c. Нам нужно подключить сигнал активации к обработчику. Мы используем функцию, g_signal_connectкоторая связывает сигнал с обработчиком.
Сначала мы определяем обработчик, on_activateкоторый просто отображает сообщение. В функции main, которую мы добавляем g_signal_connectраньше g_application_run. У функции g_signal_connectчетыре аргумента.
Объект, которому принадлежит сигнал.
Название сигнала.
Функция-обработчик (также называемая обратным вызовом), которую нужно передать
G_CALLBACK.Данные для передачи обработчику. Если данные не требуются, следует указать NULL.
Вы можете найти описание каждого сигнала в справочнике API. Например, сигнал «activate» находится в разделе GApplication справочника GIO API. Функция обработчика описана в этом разделе.
Кроме того, g_signal_connectэто описано в справочнике GObject API. Ссылка на API очень важна. Вы должны это увидеть и понять, чтобы писать приложения GTK. Они находятся в «Центре разработчиков GNOME» .
Давайте скомпилируем исходный файл выше ( pr2.c) и запустим его.
Вы могли заметить, что набирать такую длинную строку для компиляции болезненно. Для решения этой проблемы рекомендуется использовать сценарий оболочки. Создайте текстовый файл, содержащий следующую строку.
Затем сохраните его в каталоге $ HOME/bin, обычно это /home/(имя пользователя)/bin. (Если ваше имя пользователя Джеймс, тогда каталог будет /home/james/bin). И включите бит выполнения файла. Предположим, что имя файла - compэто следующая процедура.
Если вы впервые создаете каталог $ HOME/bin и сохраняете в нем файл, вам необходимо выйти из системы и снова войти в систему.
GtkWindow и GtkApplicationWindow
GtkWindow
Вывод сообщения «GtkApplication is activated» было создано в предыдущем подразделе. Это было хорошо с точки зрения теста GtkApplication. Однако этого недостаточно, поскольку GTK представляет собой основу для графического пользовательского интерфейса (GUI). Теперь мы продолжаем добавлять окно в эту программу. Что нам нужно сделать:
Создать GtkWindow.
Подключить его к GtkApplication.
Показать окно.
Теперь перепишите функцию on_activate.
Создать GtkWindow
Виджет - это абстрактное понятие, которое включает в себя все интерфейсы графического интерфейса пользователя, такие как окна, диалоговые окна, кнопки, текст, контейнеры и так далее. А GtkWidget - это базовый объект, от которого происходят все объекты графического интерфейса.
GtkWindow включает GtkWidget в первой части объекта.

Функция gtk_window_newопределяется следующим образом.
По этому определению он возвращает указатель на GtkWidget, а не на GtkWindow. Фактически он генерирует новый объект GtkWindow (не GtkWidget), но возвращает указатель на GtkWidget. Однако указатель указывает на GtkWidget, и в то же время он также указывает на GtkWindow, который содержит в себе GtkWidget.
Если вы хотите использовать winв качестве указателя на GtkWindow, вам необходимо его преобразовать.
Или вы можете использовать GTK_WINDOWмакрос, который выполняет аналогичную функцию.
Это рекомендуемый способ.
Подключите его к GtkApplication.
Функция gtk_window_set_applicationиспользуется для подключения GtkWindow к GtkApplication.
Вам нужно привести win к GtkWindow и app GtkApplication. GTK_WINDOWи GTK_APPLICATIONмакросы подходят для этого.
GtkApplication продолжает работать до тех пор, пока соответствующее окно не будет уничтожено. Если вы не соединили GtkWindow и GtkApplication, GtkApplication немедленно отключится. Поскольку к GtkApplication не подключено ни одно окно, ему нет смысла продолжать работать. При выключении сгенерированное окно также уничтожается.
Покажи окно.
Функция gtk_widget_show используется для отображения окна.
Gtk4 изменил видимость виджета по умолчанию на true, поэтому каждому виджету не нужна эта функция, чтобы показывать себя. Но есть исключение. Верхнее окно (этот термин будет объяснен позже) не отображается, когда оно создается. Поэтому вам нужно использовать указанную выше функцию и показать окно.
Сохраните программу как, pr3.cскомпилируйте и запустите.
Появится небольшое окошко.

Нажмите кнопку закрытия, окно исчезнет, и программа завершится.
GtkApplicationWindow
GtkApplicationWindow - дочерний объект GtkWindow. Он имеет некоторые дополнительные функции для лучшей интеграции с GtkApplication. При использовании GtkApplication рекомендуется использовать его вместо GtkWindow.
Теперь перепишите программу и используйте GtkAppliction Window.
Когда вы генерируете GtkApplicationWindow, вам нужно указать объект GtkApplication в качестве аргумента. Затем он автоматически соединяет эти два объекта. Так что звонить gtk_window_set_applicationбольше не нужно .
Программа устанавливает заголовок и размер окна по умолчанию. Скомпилируйте и запустите a.out, после чего вы увидите окно большего размера с заголовком «pr4».

Last updated
Was this helpful?