GtkApplication и GtkApplicationWindow
GtkApplication
GtkApplication и g_application_run
Обычно люди пишут программный код для создания приложений. Что за приложения? Приложения - это программное обеспечение, которое запускается с использованием библиотек, включая ОС, фреймворки и так далее. В программировании на Gtk4 GtkApplication - это объект, работающий в библиотеках GTK.
Основной способ написания GtkApplication следующий.
Создать объект GtkApplication
Запустить его
Это все. Очень просто. Ниже приведен код C, представляющий описанный выше сценарий.
В первой строке написано, что эта программа включает файлы заголовков библиотек 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. Функция обработчика описана в этом разделе.
Давайте скомпилируем исходный файл выше ( 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?