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 。

相关文章
相关标签/搜索