入门指南
GTK 是一个小部件工具包。每个由 GTK 创建的用户界面都由小部件组成。这是使用 GObject 在 C 中实现的,GObject 是一个用于 C 的面向对象框架。小部件以层次结构组织。窗口小部件是主容器。然后,通过将按钮、下拉菜单、输入字段和其他小部件添加到窗口来构建用户界面。如果您要创建复杂的用户界面,建议使用 GtkBuilder 及其 GTK 特定的标记描述语言,而不是手动组装界面。
GTK 是事件驱动的。工具包侦听诸如单击按钮之类的事件,并将事件传递给您的应用程序。
以下是一些示例,可帮助您开始 GTK 编程。
注意:我们假设您已安装 GTK、其依赖项和一个 C 编译器并已准备好使用。如果您需要先构建 GTK 本身,请参阅本参考中的“编译 GTK 库”部分。
C 语言的 Hello World 应用程序
为了开始介绍 GTK,我们将从一个简单的 Hello World
GTK 应用程序开始。
创建一个新文件,其中包含以下内容,并命名为 hello-world-gtk.c
。
#include <gtk/gtk.h>
static void
print_hello (GtkWidget *widget,
gpointer data)
{
g_print ("Hello World\n");
}
static void
activate (GtkApplication *app,
gpointer user_data)
{
GtkWidget *window;
GtkWidget *button;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Hello");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
button = gtk_button_new_with_label ("Hello World");
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
gtk_window_set_child (GTK_WINDOW (window), button);
gtk_window_present (GTK_WINDOW (window));
}
int
main (int argc,
char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
您可以使用 GCC 编译上面的程序,方法是
gcc $(pkg-config --cflags gtk4) -o hello-world-gtk hello-world-gtk.c $(pkg-config --libs gtk4)
然后您可以使用以下命令运行该程序
./hello-world-gtk
有关如何编译 GTK 应用程序的更多信息,请参阅 GTK API 参考中的编译 GTK 应用程序部分。
解释
初始化应用程序
在 GTK 应用程序中,main()
函数的目的是创建一个 GtkApplication
对象并运行它。在此示例中,使用 gtk_application_new()
创建并初始化 GtkApplication
实例。
创建 GtkApplication
时,您需要选择一个应用程序标识符(名称)并将其作为参数输入到 gtk_application_new()
。对于此示例,使用了 org.gtk.example
,但有关为您的应用程序选择标识符的信息,请参阅本指南。最后,gtk_application_new()
采用 GApplicationFlags
参数,该参数控制应用程序的一些功能,例如能够打开在命令行上指定的文件,或解析命令行选项。
接下来,激活信号连接到 main()
函数上方的 activate()
函数。当您的应用程序使用下面的 g_application_run()
启动时,将发送激活信号。g_application_run()
还将指向命令行参数计数器和字符串数组的指针作为参数;这允许 GTK 解析控制 GTK 本身行为的特定命令行参数。解析后的参数将从数组中删除,留下未识别的参数供您的应用程序解析。
在 g_application_run
中,发送 activate()
信号,然后我们进入应用程序的 activate()
函数。在 activate()
函数内部,我们想要构建 GTK 窗口,以便在应用程序启动时显示窗口。调用 gtk_application_window_new()
将创建一个新的 GtkApplicationWindow
实例,并将其存储在 window
指针中。该窗口将具有一个框架、一个标题栏和取决于平台的窗口控件。
使用 gtk_window_set_title()
设置窗口标题。此函数将 GtkWindow
指针和一个字符串作为输入。由于我们的 window 指针是 GtkWidget 指针,因此我们需要将其强制转换为 GtkWindow
。但是,不是通过通常的 C 强制转换运算符 (GtkWindow *)
强制转换 window,而应使用 GTK_WINDOW()
宏强制转换 window
。GTK_WINDOW()
将在强制转换之前执行运行时检查,以查看指针是否是 GtkWindow
类的实例,如果检查失败,则会发出警告。有关此约定的更多信息,请参见此处。
最后,使用 gtk_window_set_default_size()
设置窗口大小,然后通过 gtk_window_present()
由 GTK 显示窗口。
当您退出窗口时(例如,通过按 X),主循环中的 g_application_run()
将返回一个数字,该数字保存在名为“status”的整数中。之后,GtkApplication
对象使用 g_object_unref()
从内存中释放。最后,将状态整数返回给操作系统,并且 GTK 应用程序退出。
添加按钮
如上所示,hello-world-gtk.c
将一个带有“Hello World”标签的按钮添加到我们的窗口中。声明一个新的 GtkWidget
指针来实现此目的,即 button
,并通过调用 gtk_button_new_with_label()
进行初始化,该函数返回一个 GtkButton
以存储在 button
中。之后,将 button
添加到我们的 window
。使用 g_signal_connect
,按钮连接到我们应用程序中名为 print_hello()
的函数,以便在单击按钮时,GTK 将调用此函数。由于 print_hello()
函数不使用任何数据作为输入,因此将 NULL 传递给它。print_hello()
调用 g_print()
,并使用字符串“Hello World”,如果从终端启动 GTK 应用程序,则将在终端中打印 Hello World。
后续步骤
GTK 文档包含一个关于如何创建复杂应用程序的完整示例,该应用程序能够打开文件、存储和加载设置、使用菜单和更复杂的小部件。