GTK+學習筆記 --- hello word

概述

GTK+ 是一組控件集。經過使用包含的控件構建用戶界面。GTK+ 是由基於對象化的C語言框架GObject實現。控件是分層次的,window 控件爲主容器,而後經過添加一系列按鈕、菜單、輸入框和其餘控件來完成用戶界面。若是你要完成複雜的用戶界面,這就須要使用GtkBuilder,它是GTK+制定的用來替代手動組裝控件的標記描述語言。固然,你也可使用其餘的 UI 構建工具,如 Glade。bash

GTK+ 是事件驅動的。監聽器監聽諸如點擊一個按鈕之類的事件,而後將時間傳遞給你的程序。app

Hello word

下面咱們實現一個簡單的含有事件回調的應用,它將實現一個 200 x 200 的空白窗口,example-0.c。框架

#include <gtk/gtk.h>

static void
activate (GtkApplication* app,
          gpointer        user_data)
{
  GtkWidget *window;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
  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;
}

編譯:函數

gcc `pkg-config --cflags gtk+-3.0` -o example-0 example-0.c `pkg-config --libs gtk+-3.0`

首先,全部的GTK+應用都應該包含 gtk/gtk.h 頭文件。工具

在 main 方法中, 經過 gtk_application_new() 建立一個 GtkApplication,它的兩個參數分別是 application 的名字和標識。ui

接下來 activate 信號鏈接位於 main 函數上的 activate 函數。當 application 在隨 g_application_run() 啓動後,activate 信號將被髮送。g_application_run() 函數的後兩個參數爲命令行參數。spa

在 g_application_run 中,activate 信號被髮送而後執行 activate() 方法。在 activate() 方法中,咱們建立咱們的GTK窗口,用來在程序啓動的時候顯示。gtk_application_window_new() 方法建立一個GtkWindow ,並將它的指針賦予 window 。window 將有一個框架、一個頭部條目。命令行

gtk_window_set_title() 爲窗口設置 title。兩個參數分別爲 GtkWindow* 和 string 。因爲 window 是 GtkWidget * 類型,因此用 GTK_WINDOW() 進行類型轉換。指針

最後經過 gtk_window_set_default_size 函數設置 window 尺寸,經過 gtk_widget_show_all 來顯示window。code

在你按 「x」 推出 window以前,在主循環中的 g_application_run() 函數會返回一個數字,並保存在status中。

然後,經過 g_object_unref() 函數,GtkApplication 被從內存中釋放。最終, status 被返回,GTK 程序退出。

當程序正在運行,GTK+ 也接收消息。一般輸入事件是由用戶交互產生的,但也有一些是窗口管理器或者其餘應用產成的。GTK+ 處理這些事件,信號被髮送到控件。經過鏈接這些信號的回調函數,進而對用戶輸入做出迴應。

帶有按鈕的窗口

建立一個新文件---example-1.c。

#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;
}

編譯:

gcc `pkg-config --cflags gtk+-3.0` -o example-1 example-1.c `pkg-config --libs gtk+-3.0`

此例比上例增長了一個按鈕。爲了完成功能,咱們須要添加兩個指針變量,button 和 button_box 。button_box 變量保存一個 GtkButtonBox 類型指針,GtkButtonBox 以GTK+的方式控制一組button的大小和排列。GtkButtonBox 經過 gtk_button_box_new() 建立,改函數須要一個枚舉類型的 GTKOrientation 做爲參數。在本例中只有一個按鈕,使用水平或垂直的排列方式均可以。 經過 gtk_container_add() 函數將 button_box添加到 window 。

button的初始化方法和button_box相似,而後被添加到button_box。而後經過 g_signal_connect 爲 button 設置點擊回調函數 print_hello(),這樣一來,當 button 被點擊,GTK 將調用該函數。print_hello() 函數調用 g_print() 函數將字符串 "Hello World" 輸出到終端。

鏈接了 print_hello() 函數後,另外一個處理點擊事件的函數 g_signal_connect_swapped() 也被鏈接。該函數與 g_signal_connect() 類似,在回調函數的處理上不一樣。g_signal_connect_swapped() 函數容許你指定第四個參數做爲data傳遞給回調函數。在本例中回調函數是 gtk_widget_destroy() 函數,並把 window 指針傳遞給它。這起的做用就是,當 button 被點擊時,整個的 GTK window 都被銷燬。 一般狀況下,經過 g_signal_connect() 函數將 gtk_widget_destroy() 做爲點擊事件的回調,當button 被點擊,銷燬的是button自己,而不是整個 window 。

相關文章
相關標籤/搜索