[GTK3 筆記] 用 GTK 寫一個 HelloWorld 視窗程式

GTK(GIMP Toolkit)是一開發 GUI(圖形使用者界面)的 toolkit。

安裝 GTK3

如果你是使用 Ubuntu 只須下一條指令即可安裝:

sudo apt-get install libgtk-3-dev

第一個 HelloWorld 程式

請參考官方教學: Getting Started with GTK+

官方教學寫得非常詳盡,這裡就不多加解釋,如果你照著教學做完,程式碼應該會長這樣:

#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;
  GtkWidget *button_box;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
  gtk_container_add (GTK_CONTAINER (window), button_box);

  button = gtk_button_new_with_label ("Hello World");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
  g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
  gtk_container_add (GTK_CONTAINER (button_box), button);

  gtk_widget_show_all (window);
}

int main (int argc, char **argv) {
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

編譯完以後執行程式應該會看到一個視窗有一個按鈕叫做「Hello World」,點下去整個視窗會被關閉。

上面的程式碼比較特別的地方在於 g_signal_connectg_signal_connect_swapped 的差異,以這個例子而言如果上面的程式碼不用 g_signal_connect_swapped 而是用 g_signal_connect 的話,就得寫成這樣:

static void destroy_window (GtkButton *button, GtkWidget *window) {
    gtk_widget_destroy (window);
}
static void activate (GtkApplication *app, gpointer user_data) {
    .
    .
    .
    g_signal_connect (button, "clicked", G_CALLBACK (destroy_window), window);
    .
    .
    .
}

如果用 g_signal_connect 的話, callback function 第一個接收到的參數會是觸發這個 signal 的物件,但因為這個例子我們想要關閉的是整個視窗而不是「Hello World」按鈕,所以如果使用 g_signal_connect 的話就得額外寫一個 wrapper function。

comments powered by Disqus
分享至 Facebook 分享至 Google +