其他分享
首页 > 其他分享> > 一、GTK+3按钮

一、GTK+3按钮

作者:互联网

1 Ubuntu下安装GTK±3.0

  打开终端,运行以下命令:

sudo apt-get install libgtk-3-dev

2 GCC编译命令

gcc *.c  -o test `pkg-config --cflags --libs gtk+-3.0`

3 一个简单的按钮

#include <gtk/gtk.h>

/* 这是一个回调函数
 * 其中 GtkWidget 是类
 * data 用户数据指针
 */
void 
hello(GtkWidget *widget, gpointer data)
{
  gchar *c =(gchar *)data; 
  g_printf("data = %s\n", data);
}

gint
delet_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
  /**
   * 如果你的“delete_event”信号处理函数返回FALSE,GTK会发出“destroy”信号。
   * 返回TRUE,你不希望关闭窗口
   * 当你想弹出“你确定要退出吗?”对话框时它很有用
  */
  g_printf("delete event occured\n");

  /*改TRUE为FLASE 程序会关闭*/
  return TRUE;
}

void
destroy(GtkWidget *widget, gpointer data)
{
  gtk_main_quit();
}

int
main(int argc, char *argv[])
{
  /* 都是基于GtkWidget类 */
  GtkWidget *window;
  GtkWidget *button;

  /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中 */
  gtk_init(&argc, &argv);

  /* 创建一个窗口 
   * GTK_WINDOW_TOPLEVEL 对话窗口
   * GTK_WINDOW_POPUP 提示窗口
   */
  window =  gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_container_set_border_width(GTK_CONTAINER(window), 100);
  /*初始位置*/
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

  /**
   * 通常是点击“关闭”选项,或者标题栏上的关闭按钮,系统会发出"delete_event"信号 
   * 我们让他调用在前面定义的delete_event() 函数
   * 传给回调函数的data参数值是NULL,它会被回调函数忽略
  */
  g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delet_event), NULL);
  /**
   * 对这个窗口调用gtk_widget_destroy()函数或在“delete_event”回调函数中返回FALSE值
   * 系统会发出 “destroy”信号
  */
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);

  /* 创建一个button对象,并且标签“Hello World” */
  button = gtk_button_new_with_label("close");

  gchar *str = "close";
  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(hello), str);
  g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), window);

  /* button 放入 window */
  gtk_container_add(GTK_CONTAINER(window), button);

  gtk_widget_show(button);
  gtk_widget_show(window);

  /* 所有的 GTK 程序必须有一个 gtk_main() 函数 
   * 程序运行停在这里等待事件(如键盘事件或鼠标事件)的发生
   */
  gtk_main();

  return 0;
}

分析
  1.关于窗口关闭问题,以下是我通过程序得出的结论,并非找到确切资料所述。

  2.g_signal_connect_swapped函数可以交换对象的地址。从而避免再写一个函数来交换对象地址。

g_signal_connect_swapped (button, "clicked",
                          (GCallback) gtk_widget_hide, other_widget);
/* Rather than the cumbersome: */
static void
button_clicked_cb (GtkButton *button, GtkWidget *other_widget)
{
     gtk_widget_hide (other_widget);
}
g_signal_connect (button, "clicked",
                  (GCallback) button_clicked_cb, other_widget);

4 多个按钮

4.1 容器控件

  GTK中所有元素都叫做控件,控件分为2种:

  另一种容纳多个控件的容器:

4.2 GtkHBox与GtkVBox

  GtkBox是不能设定控件位置的容器,其继承架构关系如下:

	GObject
    +---GInitiallyUnowned
       +----GtkObject
          +-----GtkWidget
             +------GtkContainer
               +-------GtkBox
                   +-------GtkVBox
                   +-------GtkHBox
                   +-------GtkButtonBox
#include <gtk/gtk.h>

int
main(int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *image;
  GtkWidget *button;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Splash窗口");
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 10, 10);
  g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);

  /* Param 1:所有的元件是否平均分配空间
   * Param 2:设定两元件直接的空间,单位是像素(Pixel)
   */
  vbox = gtk_vbox_new(TRUE, 10);
  gtk_container_add(GTK_CONTAINER(window), vbox);
  
  image = gtk_image_new_from_file("3.image-button.png");
  /* 将元件放入GtkVBox中 则要使用gtk_box_pack_start() 或 gtk_box_pack_end()
   * 前者将元件从容器的前边加入,后者将元件从容器的后边加入
   * expand :设定Widget是否使用所有的可用空间,设定True,Widget的可用空间随着vbox
   *          大小改变而改变(但Widget元件本身不变)
   * fill   :只有expand设定为TRUE时才有用,可设定Widget是否填满可用空间,
   *          设定TRUE时,Widget的大小会随着GtkVBox大小而改变
   * padding :元件边界空隙
   */
  gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 0);

  button = gtk_button_new_with_label("close");
  gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 20);
  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

参考1 :GTK+3系列教程1:搭建GTK+3开发环境
参考2:案件代码参考
参考3:容器控件知识
参考4:GtkHBox与GtkVBox

标签:控件,GTK,容器,button,gtk,window,按钮
来源: https://blog.csdn.net/Creationyang/article/details/120062532