<- 上一篇(Windows下安装和配置GTK4(基于CLion))

代码详解

本期我们将深入研究 GTK 的初始代码。首先,展示完整代码:

#include <gtk/gtk.h>

static void on_activate (GtkApplication *app) {
    // 创建新窗口
    GtkWidget *window = gtk_application_window_new (app);

    // 创建带标签的新按钮
    GtkWidget *button = gtk_button_new_with_label ("Hello, World!");

    // 点击按钮时,关闭窗口
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_window_close), window);

    // 将按钮设置为窗口的子部件
    gtk_window_set_child (GTK_WINDOW (window), button);

    // 显示窗口
    gtk_window_present (GTK_WINDOW (window));
}

int main (int argc, char *argv[]) {
    // 创建新应用
    GtkApplication *app = gtk_application_new ("com.example.GtkApplication",
                                               G_APPLICATION_FLAGS_NONE);

    // 连接 "activate" 信号到回调函数
    g_signal_connect (app, "activate", G_CALLBACK (on_activate), NULL);

    // 运行应用
    return g_application_run (G_APPLICATION (app), argc, argv);
}

接下来,我们逐行分析:

#include <gtk/gtk.h>

引入 GTK 头文件,这是使用 GTK 的必要步骤。

static void on_activate (GtkApplication *app) {

定义回调函数 on_activate,它在应用启动时被调用。参数 app 是指向 GtkApplication 实例的指针。

GtkWidget *window = gtk_application_window_new (app);

使用 gtk_application_window_new 函数创建一个新窗口,并将其与 GtkApplication 实例关联。

GtkWidget *button = gtk_button_new_with_label ("Hello, World!");

创建一个带有 "Hello, World!" 标签的新按钮。

g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_window_close), window);

将按钮的 "clicked" 信号连接到 gtk_window_close 函数,实现点击按钮关闭窗口的功能。g_signal_connect_swapped 确保在信号处理程序中,窗口作为参数传递。

gtk_window_set_child (GTK_WINDOW (window), button);

将按钮设置为窗口的子部件,使其显示在窗口中。

gtk_window_present (GTK_WINDOW (window));

显示窗口,使其对用户可见。

int main (int argc, char *argv[]) {

主函数。

GtkApplication *app = gtk_application_new ("com.example.GtkApplication", G_APPLICATION_FLAGS_NONE);

创建一个新的 GtkApplication 实例。第一个参数是应用程序的唯一标识符,建议根据项目进行修改。第二个参数是行为标志,通常设置为 G_APPLICATION_FLAGS_NONE

g_signal_connect (app, "activate", G_CALLBACK (on_activate), NULL);

GtkApplication 实例的 "activate" 信号连接到 on_activate 回调函数。当应用程序启动时,该信号被触发,从而执行 on_activate 函数。

return g_application_run (G_APPLICATION (app), argc, argv);

运行应用程序的主循环,并返回应用程序的退出状态。

GTK 美化方案

我选择 Adwaita 作为 GTK 的美化方案。可以使用以下命令安装(使用 MSYS UCRT):

pacman -S mingw-w64-ucrt-x86_64-libadwaita

安装完成后,修改 CMakeLists.txt 文件以导入 Adwaita:

添加以下行:

pkg_check_modules(ADWAITA libadwaita-1 REQUIRED)

修改 target_link_libraries 行(将 test 替换为您的项目名称):

target_link_libraries(test ${GTK4_LIBRARIES} ${ADWAITA_LIBRARIES})

修改后的 CMakeLists.txt 文件应类似于这样。

更新 CMake 后,将代码修改为:

#include <libadwaita-1/adwaita.h>

static void activate_cb (GtkApplication *app) {
    // 创建一个新的应用程序窗口
    GtkWidget *window = gtk_application_window_new (app);

    // 创建一个新的标签,显示文本 "Hello World"
    GtkWidget *label = gtk_label_new ("Hello World");

    // 设置窗口的标题为 "Hello"
    gtk_window_set_title (GTK_WINDOW (window), "Hello");

    // 设置窗口的默认大小为 200x200 像素
    gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

    // 将标签设置为窗口的子部件
    gtk_window_set_child (GTK_WINDOW (window), label);

    // 显示窗口
    gtk_window_present (GTK_WINDOW (window));
}

int main (int argc, char *argv[]) {
    // 创建一个新的 Adwaita 应用程序实例,应用程序 ID 为 "org.example.Hello"
    g_autoptr (AdwApplication) app = adw_application_new ("org.example.Hello", G_APPLICATION_DEFAULT_FLAGS);

    // 连接应用程序的 "activate" 信号到 activate_cb 回调函数
    g_signal_connect (app, "activate", G_CALLBACK (activate_cb), NULL);

    // 运行应用程序,返回应用程序的状态
    return g_application_run (G_APPLICATION (app), argc, argv);
}

这段代码与之前的 GTK 代码基本一致,并且我已经添加了逐行注释。现在,让我们看看效果:

49620_tv0c_1198.png

对比图:

52840_0hcn_6694.png

可以看到,窗口的外观比原生 GTK 更好看。本期内容就到这里,下一期我需要再学习一下才能继续写下去...

下一篇(GTK事件绑定简单解释)->