構建一個頂層窗口,包含一個標籤為「Hello World」的按鈕。點擊按鈕控制台輸出「你好,世界」,關閉窗口退出程序。演示 GTK+ 核心概念:窗口層級、容器佈局、信號連接、主事件循環。
#include\ // 回調:按鈕點擊時打印問候\ static void print_hello(GtkWidget *widget, gpointer data) {\ g_print("你好,世界\\n");\ }\ // 回調:窗口 delete-event,返回 TRUE 阻止默認關閉行為\ static gboolean on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) {\ g_print("delete event occurred\\n");\ return TRUE; // TRUE = 不發射 destroy 信號,窗口不關閉\ }\ int main(int argc, char *argv[]) {\ GtkWidget *window;\ GtkWidget *button;\ \ gtk_init(&argc, &argv); // 初始化 GTK\ \ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);\ gtk_window_set_title(GTK_WINDOW(window), "你好");\ \ // 連接信號:delete-event -> on_delete_event\ g_signal_connect(window, "delete-event", G_CALLBACK(on_delete_event), NULL);\ // 連接信號:destroy -> gtk_main_quit (退出主循環)\ g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);\ \ gtk_container_set_border_width(GTK_CONTAINER(window), 10);\ // 創建帶標籤的按鈕\ button = gtk_button_new_with_label("Hello World");\ // clicked 信號 -> print_hello\ g_signal_connect(button, "clicked", G_CALLBACK(print_hello), NULL);\ // clicked 信號(交換參數) -> gtk_widget_destroy(window) 關閉窗口\ g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);\ \ gtk_container_add(GTK_CONTAINER(window), button); // 容器添加子控件\ gtk_widget_show(button);\ gtk_widget_show(window);\ \ gtk_main(); // 進入主事件循環\ return 0;\ }
g_signal_connect(instance, signal_name, callback, data):將信號綁定到回調,data 作為用戶數據傳給回調。g_signal_connect_swapped:交換 instance 與 data 位置,使回調接收 data 作為第一參數。此處讓 gtk_widget_destroy 直接接收 window 指針。| 信號 | 觸發時機 | 默認行為 | 本例處理 |
|---|---|---|---|
| delete-event | 用戶點擊關閉按鈕、Alt+F4 | 發射 destroy | 返回 TRUE 攔截,打印日誌,窗口不關 |
| destroy | 窗口實際銷毀 | 無 | 調用 gtk_main_quit 退出主循環 |