ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一、GTK+3按钮

2021-09-05 09:34:39  阅读:268  来源: 互联网

标签:控件 GTK 容器 button gtk window 按钮


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.关于窗口关闭问题,以下是我通过程序得出的结论,并非找到确切资料所述。

  • 点击标题栏的关闭按钮 -> 该对象系统发出”delete_event“信号
  • 如果没有设定”delete_event“信号回调函数,系统会自动发出”destroy“信号;如果回调函数的返回值TRUE,则系统不发出”destroy“信号,FALSE则发出。

  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种:

  • 非容器控件:其中非容器控件不能再容纳其他控件,如标签(GtkLabel)、图像(GtkImage)、画布(GtkDrawingArea)等界面编程中最基本的元素。
  • 容器控件:其中容器控件又分为只能容纳一个控件的容器和能容纳多个控件的容器。只能容纳一个控件的容器,如窗口类、对话框、按钮、框架、事件盒。初学者一般会这样写程序,先新建一个窗口,然后再向窗口添加各种各样的控件。但是,窗口控件是一个只能容纳一个控件的容器,往上面添加了一个按钮后,再想添加一个按钮GTK就会报错。所以正确的做法应该是先向窗口中添加一个能容纳多个控件的容器,再向这个容器里添加所需的控件。

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

  • 不能设定控件的位置,但是可以依次设定控件的排放次序的容器:如盒状容器(GtkBox),它有分为横向排列容器(hbox)和纵向排列的容器(vbox)
  • 可以设定自控位置的容器有2种:自由布局控件(GtkFixed)能按固定坐标放置子控件的容器;布局控件(GtkLayout)是个无穷大的滚动区域,能包含子控件,也能制定绘图。

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有