學習 GUI 框架最好的方式是「先跑起來,再理解」。本文以遞進式代碼演示 GTK+ 程序骨架:創建窗口 → 添加關閉事件 → 設置標題 → 理解面向對象映射關係。所有代碼在 Windows (MSVC) 與 Linux (GCC) 雙平台驗證通過。
#include
int main(int argc, char** argv) {
GtkWidget* window;
gtk_init(&argc, &argv); // 1. 初始化 GTK+ 環境
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 2. 創建頂層窗口
gtk_widget_show(window); // 3. 顯示窗口(及所有子控件)
gtk_main(); // 4. 進入主事件循環
return 0;
}
| C 風格 API | 面向對象等價伪碼 | 說明 |
|---|---|---|
GtkWidget* window | GtkWidget* window | 基類指針指向派生對象 |
gtk_init() | Gtk::init() | 庫初始化 |
gtk_window_new() | new GtkWindow(GTK_WINDOW_TOPLEVEL) | 構造函數,參數指定窗口類型 |
gtk_widget_show() | window->show() | 虛函數,顯示控件 |
gtk_main() | Gtk::main() | 事件循環,分發信號 |
關鍵認知: GTK+ 用 C 實現面向對象,GtkWidget 是所有控件的基類,GtkWindow 繼承自 GtkWidget。API 命名規律:gtk_<類名>_<方法名>()。
缺少信號連接。GTK+ 使用信號槽機制:
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
window:發射信號的對象"destroy":信號名稱(窗口銷毀時發射)gtk_main_quit:回調函數,結束 gtk_main() 循環G_CALLBACK:宏,統一回調函數指針類型Windows (/SUBSYSTEM:WINDOWS)-mwindows 鏈接標誌
gtk_window_set_title(GTK_WINDOW(window), "Hello World!");
GTK_WINDOW(window):類型轉換宏,將 GtkWidget* 安全轉為 GtkWindow*,包含運行時類型檢查static_cast(window)->set_title("Hello World!")
#include
int main(int argc, char** argv) {
gtk_init(&argc, &argv);
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GTK+ 入門實戰");
// 關鍵:連接 destroy 信號,點關閉鈕退出程序
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show(window);
gtk_main();
return 0;
}
gtk_init(&argc, &argv) 解析命令行參數(如 --display、--gtk-module)gtk_*_new() 系列函數返回 GtkWidget*(基類指針)GTK_<類名>(widget) 宏實現安全向下轉型gtk_<類名>_set_<屬性>() 系列函數g_signal_connect(instance, "signal-name", callback, data) 統一事件處理入口gtk_widget_show(widget) 遞歸顯示控件樹gtk_main() 阻塞等待並分發事件,gtk_main_quit() 退出
# Linux / MSYS2 / MinGW
gcc main.c -o main `pkg-config --cflags --libs gtk+-3.0`
# Windows MSVC (命令行)
cl main.c /I"D:\GTK\include\gtk-3.0" /I"D:\GTK\include\glib-2.0" ... /link /LIBPATH:"D:\GTK\lib" gtk-3.lib gdk-3.lib ...
GtkBox、GtkGrid、GtkPanedGtkButton、GtkLabel、GtkEntry、GtkTextViewg_signal_connect_swappedGtkWidget 自定義控件、屬性系統、接口GtkCssProvider 美化界面掌握「創建→屬性→信號→顯示→主循環」這五步,即掌握了 GTK+ 開發的核心工作流。