<- 上一篇(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 代码基本一致,并且我已经添加了逐行注释。现在,让我们看看效果:
对比图:
可以看到,窗口的外观比原生 GTK 更好看。本期内容就到这里,下一期我需要再学习一下才能继续写下去...
评论