入门指南

GTK 是一个小部件工具包。每个由 GTK 创建的用户界面都由小部件组成。这是使用 GObject 在 C 中实现的,GObject 是一个用于 C 的面向对象框架。小部件以层次结构组织。窗口小部件是主容器。然后,通过将按钮、下拉菜单、输入字段和其他小部件添加到窗口来构建用户界面。如果您要创建复杂的用户界面,建议使用 GtkBuilder 及其 GTK 特定的标记描述语言,而不是手动组装界面。

GTK 是事件驱动的。工具包侦听诸如单击按钮之类的事件,并将事件传递给您的应用程序。

以下是一些示例,可帮助您开始 GTK 编程。

注意:我们假设您已安装 GTK、其依赖项和一个 C 编译器并已准备好使用。如果您需要先构建 GTK 本身,请参阅本参考中的“编译 GTK 库”部分。

C 语言的 Hello World 应用程序

Hello World Application in GTK using C

为了开始介绍 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() 宏强制转换 windowGTK_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 文档包含一个关于如何创建复杂应用程序的完整示例,该应用程序能够打开文件、存储和加载设置、使用菜单和更复杂的小部件。

发现错别字或缺少信息,编辑此页面
阅读如何为此网站做出贡献