GTK+ 中的第一个程序
最后修改于 2023 年 10 月 18 日
在本 GTK+ 编程教程中,我们创建了第一个 GTK+ 程序。我们在屏幕上居中一个窗口,在标题栏中显示一个图标,显示一个小的工具提示,并为按钮小部件创建一个助记符。
简单示例
我们的第一个例子展示了一个基本窗口。
#include <gtk/gtk.h> int main(int argc, char *argv[]) { GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_show(window); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0; }
此示例在屏幕上显示一个基本窗口。
GtkWidget *window;
GtkWidget
是 GTK+ 中所有小部件派生的基类。它管理小部件的生命周期、状态和样式。
gtk_init(&argc, &argv);
gtk_init
函数初始化 GTK+ 并解析一些标准的命令行选项。在使用任何其他 GTK+ 函数之前,必须调用此函数。
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_new
函数创建一个新的 GtkWindow
,它是一个可以包含其他小部件的顶级窗口。窗口类型为 GTK_WINDOW_TOPLEVEL
;顶级窗口有一个标题栏和一个边框。它们由窗口管理器管理。
gtk_widget_show(window);
get_widget_show
标记一个小部件以供显示。任何未显示的小部件都不会出现在屏幕上。
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect
函数将回调函数连接到特定对象的信号。默认情况下,窗口不会对 destroy
信号做出反应。我们必须通过将 destroy
信号连接到内置的 gtk_main_quit
函数来显式终止应用程序,该函数终止应用程序。
gtk_main();
此代码进入 GTK+ 主循环。从这一点开始,应用程序会等待事件发生。
$ gcc -o simple simple.c `pkg-config --libs --cflags gtk+-2.0`
这就是我们编译示例的方式。

居中窗口
如果我们不自己定位窗口,窗口管理器将为我们定位它。在下一个例子中,我们将窗口居中。
#include <gtk/gtk.h> int main(int argc, char *argv[]) { GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Center"); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_widget_show(window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0; }
在示例中,我们居中窗口,设置标题,并调整窗口大小。
gtk_window_set_title(GTK_WINDOW(window), "Center");
gtk_window_set_title
函数设置窗口标题。如果我们不自己设置标题,GTK+ 将使用源文件的名称作为标题。
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
此 gtk_window_set_default_size
将窗口大小设置为 230x150。请注意,我们正在讨论客户区,不包括窗口管理器提供的装饰。
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
将常量 GTK_WIN_POS_CENTER
传递给 gtk_window_set_position
函数会将程序居中于屏幕上。
应用程序图标
在下一个示例中,我们显示应用程序图标。大多数窗口管理器在标题栏的左角以及任务栏上显示该图标。
#include <gtk/gtk.h> GdkPixbuf *create_pixbuf(const gchar * filename) { GdkPixbuf *pixbuf; GError *error = NULL; pixbuf = gdk_pixbuf_new_from_file(filename, &error); if (!pixbuf) { fprintf(stderr, "%s\n", error->message); g_error_free(error); } return pixbuf; } int main(int argc, char *argv[]) { GtkWidget *window; GdkPixbuf *icon; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Icon"); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); icon = create_pixbuf("web.png"); gtk_window_set_icon(GTK_WINDOW(window), icon); gtk_widget_show(window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_object_unref(icon); gtk_main(); return 0; }
代码示例显示一个应用程序图标。
pixbuf = gdk_pixbuf_new_from_file(filename, &error);
gdk_pixbuf_new_from_file
函数通过从文件加载图像来创建一个新的 pixbuf。文件格式会自动检测。如果返回 NULL,则将设置一个错误。
if (!pixbuf) { fprintf(stderr, "%s\n", error->message); g_error_free(error); }
如果无法加载图标,则会打印一条错误消息。
icon = create_pixbuf("web.png"); gtk_window_set_icon(GTK_WINDOW(window), icon);
gtk_window_set_icon
显示窗口的图标。create_pixbuf
从 PNG 文件创建 GdkPixbuf
。
g_object_unref(icon);
g_object_unref
减少 pixbuf 对象的引用计数。当其引用计数降为 0 时,该对象被 finalization(即,其内存被释放)。

工具提示
工具提示是一个小的矩形窗口,它提供关于对象的一个简短信息。它通常是 GUI 组件;它是应用程序帮助系统的一部分。
#include <gtk/gtk.h> int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; GtkWidget *halign; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Tooltip"); gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); gtk_container_set_border_width(GTK_CONTAINER(window), 15); button = gtk_button_new_with_label("Button"); gtk_widget_set_tooltip_text(button, "Button widget"); halign = gtk_alignment_new(0, 0, 0, 0); gtk_container_add(GTK_CONTAINER(halign), button); gtk_container_add(GTK_CONTAINER(window), halign); gtk_widget_show_all(window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0; }
该示例显示了按钮小部件上的基本工具提示。
gtk_container_set_border_width(GTK_CONTAINER(window), 15);
gtk_container_set_border_width
设置窗口边缘周围的一些边框空间。
gtk_widget_set_tooltip_text(button, "Button widget");
gtk_widget_set_tooltip_text
为给定的小部件设置基本工具提示。
halign = gtk_alignment_new(0, 0, 0, 0); gtk_container_add(GTK_CONTAINER(halign), button);
GtkAlignment
是一个基本容器,可用于将其子级与窗口的侧面对齐。在我们的例子中,按钮放置在窗口的左上角。该函数的第一个参数是 xalign 和 yalign。xalign 的值为 0 表示左对齐;yalign 的值为 0 表示顶部对齐。第三个和第四个参数是缩放值。将 0 传递给这两个参数表示该小部件不会在两个方向上展开。
gtk_container_add(GTK_CONTAINER(window), halign);
GtkAlignment
被设置为窗口的主容器。
gtk_widget_show_all(window);
当我们处理多个小部件时,在容器上调用 gtk_widget_show_all
比单独显示所有小部件更容易。在我们的例子中,窗口和按钮都在一个镜头中显示。

助记符
助记符 是激活支持助记符的小部件的快捷键。它们可以与标签、按钮或菜单项一起使用。助记符是通过将 _ 字符添加到小部件的标签来创建的。它导致下一个字符成为助记符。该字符与无鼠标修饰符(通常为 Alt)组合。所选字符带有下划线,但可能以平台特定的方式强调。在某些平台上,只有在按下无鼠标修饰符后才会对字符加下划线。
#include <gtk/gtk.h> void print_msg(GtkWidget *widget, gpointer window) { g_printf("Button clicked\n"); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; GtkWidget *halign; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Mnemonic"); gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); gtk_container_set_border_width(GTK_CONTAINER(window), 15); button = gtk_button_new_with_mnemonic("_Button"); g_signal_connect(button, "clicked", G_CALLBACK(print_msg), NULL); halign = gtk_alignment_new(0, 0, 0, 0); gtk_container_add(GTK_CONTAINER(halign), button); gtk_container_add(GTK_CONTAINER(window), halign); gtk_widget_show_all(window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0; }
我们为按钮小部件设置了一个助记符。它可以通过 Alt+B 键盘快捷键激活。
button = gtk_button_new_with_mnemonic("_Button");
gtk_button_new_with_mnemonic
函数创建一个包含标签的新 GtkButton
。如果标签中的字符前面有下划线,则会为其添加下划线。
g_signal_connect(button, "clicked", G_CALLBACK(print_msg), NULL);
当我们触发按钮时,一条消息会打印到控制台。使用 g_signal_connect
函数,我们将 clicked
信号连接到 print_msg
函数。
目前,有三种激活按钮的方法:左键单击鼠标、Alt+B 快捷键和 Space 键(前提是按钮具有焦点)。

在本章中,我们创建了一些简单的 GTK+ 程序。