GTK+学习笔记 --- hello word

概述

GTK+ 是一组控件集。通过使用包含的控件构建用户界面。GTK+ 是由基于对象化的C语言框架GObject实现。控件是分层次的,window 控件为主容器,然后通过添加一系列按钮、菜单、输入框和其他控件来完成用户界面。如果你要完成复杂的用户界面,这就需要使用GtkBuilder,它是GTK+制定的用来替代手动组装控件的标记描述语言。当然,你也可以使用其他的 UI 构建工具,如 Glade。

GTK+ 是事件驱动的。监听器监听诸如点击一个按钮之类的事件,然后将时间传递给你的程序。

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 的名字和标识。

接下来 activate 信号连接位于 main 函数上的 activate 函数。当 application 在随 g_application_run() 启动后,activate 信号将被发送。g_application_run() 函数的后两个参数为命令行参数。

在 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。

在你按 “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 。

转载于:https://my.oschina.net/u/735973/blog/1538734

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值