首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

GTK+ 3 入門:創建窗口、添加按鈕與信號槽機制詳解

     編輯:關於C

程序功能

構建一個頂層窗口,包含一個標籤為「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;\
}

關鍵機制深度解析

1. 信號與回調(Signal/Slot)

  • g_signal_connect(instance, signal_name, callback, data):將信號綁定到回調,data 作為用戶數據傳給回調。
  • g_signal_connect_swapped:交換 instance 與 data 位置,使回調接收 data 作為第一參數。此處讓 gtk_widget_destroy 直接接收 window 指針。

2. 兩類關閉信號的區別

3. 容器與佈局

GtkWindow 繼承自 GtkBin(單子容器),gtk_container_add 直接放入按鈕。複雜佈局可用 GtkBox/GtkGrid 等多子容器。

4. 主事件循環

gtk_main() 阻塞等待事件(鍵鼠、定時器、I/O),分發信號調用回調,直到 gtk_main_quit() 返回。

編譯與運行

gcc `pkg-config --cflags --libs gtk+-3.0` hello.c -o hello\
./hello

GTK窗口截圖

擴展練習建議

  1. 將按鈕換為 GtkEntry 輸入框,activate 信號獲取文本。
  2. 使用 GtkBox 垂直排列多個控件。
  3. 添加 GtkLabel 顯示點擊計數,需在回調中修改標籤文本(傳遞 label 指針作為 data)。
  4. 嘗試 GtkApplication 現代啟動方式(GTK 3.2+)。

這個最小化示例涵蓋了 GTK+ 應用的完整生命週期:初始化 → 構建 UI 樹 → 綁定信號 → 顯示 → 主循環 → 清理,是所有 GTK 開發的起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
信號觸發時機默認行為本例處理
delete-event用戶點擊關閉按鈕、Alt+F4發射 destroy返回 TRUE 攔截,打印日誌,窗口不關
destroy窗口實際銷毀無調用 gtk_main_quit 退出主循環