三、GTK-按钮(微调按钮、复选按钮、单选按钮)、快捷键、热键

1 普通按钮控件

1.1 带图标的按钮

  主要部分的程序都是一样的,Gtk系统自带图标和用户导入图标的不同之处,主要是导入image的方式。

button
   └──hbox
        ├── image
        └── label

1.1.1 使用系统自带图标

GtkWidget* user_button_new_with_image_label_from_stock (gchar* stockid,gchar* title)
{ 
   GtkWidget *button;
   GtkWidget *image;
   GtkWidget *label;
   GtkWidget *hbox;
   image = gtk_image_new_from_stock(stockid,GTK_ICON_SIZE_MENU);
   label = gtk_label_new(title);
   hbox = gtk_hbox_new(FALSE,0);
   gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,3);
   gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,3);
   button = gtk_button_new();
   gtk_container_add(GTK_CONTAINER(button),hbox);
   return button;
}

1.1.2 用户自定义图标

GtkWidget *
user_button_new_with_image_label_from_file(const gchar *filename, gchar *title){
  GtkWidget *button;
  GtkWidget *image;
  GtkWidget *hbox;
  GtkWidget *label;

  image = gtk_image_new_from_file(filename);
  label = gtk_label_new(title);
  /**
   * homogeneous: 是否均匀分配空间
   *          TRUE:均匀分配盒内空间,盒内所有按最大控件的大小分配
   *          FALSE:建立不同大小的控件,以各自内容
   *  spacing:用来确定不同控件之间的间隙
   *          0:表示控件之间不留间隙
   */
  hbox = gtk_hbox_new(FALSE, 5);
  /**
   * expand:控制控件在box中排列
   *      TRUE:它们会填满box中所有额外的空间
   *      FALSE:该box会缩小到该控件的大小
   * fill:控制额外空间(这只有expand=TRUE时,才会有作用)
   *    TRUE:该控件会自行产生额外的空间
   *    FALSE:则由box产生一个在物体周围的填白区域
   */
  gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);

  button = gtk_button_new();
  gtk_container_add(GTK_CONTAINER(button), hbox);

  return button;
}

1.2 热键和快捷键

首先要区分一下热键快捷键
热键:一般是字母带下划线,在当前控件按钮,可以用Alt + 字母来代替点击的功能。
快捷键:一般指,在本窗口任何位置内,按某组合键(随意组合)都可以代替点击的功能。

1.2.1 热键

在想设为的热键字母前加一个下划线,这与其它语言也是有很大差异的.其它所有我了解的语言中,都是用"&"+字母来设定热键的,而这里是""+字母.当然,你有可能会在字符中使用"“这个字符本身.这时,你可以用”__“连续的两个下划线来实现.在显示时,就会显示出字符”_".

GtkWidget* gtk_button_new_with_mnemonic (const gchar *label);
eg.
button = gtk_button_new_with_mnemonic("消息热键(_H)");
button = gtk_button_new_with_mnemonic("_message");

1.2.2 快捷键

  Gtk中的快捷键是通过GtkAccelGroup控件来实现的。

/* 1.创建一个快捷键组 */
GtkAccelGroup *accel_group = gtk_accel_group_new();
/* 2.把快捷键组添加到window窗口 */
gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
/** 
 1. 3.控件绑定快捷键组和快捷键
 2.   accel_signal:快捷键触发按钮的信号。
 3.   accel_group:快捷键组
 4.   accel_key:表示那一个键,具体定义在gdk/gdkkeysyms.h
 5.   accel_mods:控制键类型
 6.   accel_flags:可以设置显示快捷键名,使用过程中发现,只有菜单项才显示(普通按钮不会显示)
 */
gtk_widget_add_accelerator(button, "clicked", accel_group,
                    GDK_KEY_E,GDK_CONTROL_MASK,GTK_ACCEL_VISIBLE);

2 开关按钮(Toggle Buttons)

  开关按钮由一般按钮派生而来,并且非常相似,只是开关按钮有两个状态,通过点击可以切换。它们可以是被按下的(depressed),当你再点击一下,他们会弹起来。再点击一下,他们又会弹下去。

GtkWidget *gtk_toggle_button_new( void );
GtkWidget *gtk_toggle_button_new_with_label( const gchar *label );
GtkWidget *gtk_toggle_button_new_with_mnemonic( const gchar *label );

3 复选按钮(Check Buttons)

  复选按钮左边是有一个小的方框,而文字是在其右边。常用在应用程序中以切换各选项的开和关。

/*创建普通复选按钮*/
GtkWidget *gtk_check_button_new( void );
/*带有标签的复选按钮*/
GtkWidget *gtk_check_button_new_with_label ( const gchar *label );
/*带有热键的复选按钮*/
GtkWidget *gtk_check_button_new_with_mnemonic ( const gchar *label );

4 单选按钮(Radio Buttons)

  单选按钮与复选按钮相似,只是单选按钮是分组的,在一组中只有一个处于选中/按下状态。这在你的应用程序中要从几个选项中选一个的地方可以用到。

/*创建一个单选按钮,创建一个组的第一个复选group赋值NULL*/
GtkWidget *gtk_radio_button_new(GSList *group);
/*从其他单选按钮中获得组,创建单选按钮*/
GtkWidget *gtk_radio_button_new_from_widget(GtkRadioButton *group);

/*带有标签*/
GtkWidget *gtk_radio_button_new_with_label(GSList *group,
                                           const gchar  *label );
GtkWidget* gtk_radio_button_new_with_label_from_widget( GtkRadioButton *group,
                                                        const gchar    *label );
/*带有热键*/
GtkWidget *gtk_radio_button_new_with_mnemonic( GSList *group,
                                               const gchar  *label );
GtkWidget *gtk_radio_button_new_with_mnemonic_from_widget( GtkRadioButton *group,
                                                           const gchar  *label );
/*获得单选按钮组group*/
GSList* gtk_radio_button_get_group (GtkRadioButton *radio_button);

6 微调按钮构件(Spin Buttons)

  1. 创建微调对象
  2. 创建微调按键
/* @brief 创建微调对象
 * value: 微调按钮构件的初值
 * lower: 构件允许的最小值
 * upper: 构件允许的最大值
 * step_increment 当鼠标左键按下时构件一次增加/减小的值
 * page_increment 当鼠标右键按下时构件一次增加/减小的值
 * page_size
 */
GtkObject* gtk_adjustment_new (gdouble	  value,
						       gdouble	  lower,
						       gdouble	  upper,
						       gdouble	  step_increment,
						       gdouble	  page_increment,
						       gdouble	  page_size);
/**
 * @brief:创建微调按钮构件
 * adjustment:构件变化的加速度
 * digits:显示数值的小数位
 */
GtkWidget*	gtk_spin_button_new	 (GtkAdjustment  *adjustment,
						          gdouble	    climb_rate,
						          guint	    digits);

6 按钮设置函数总结

/* 1.控件使能设置,sensitive:设置成FALSE按键变灰色,不能响应 */
void gtk_widget_set_sensitive(GtkWidget *widget, gboolean sensitive);
/* 2.设置按钮边框
 * GtkReliefStyle: 枚举类型
 *         GTK_RELIEF_NORMAL 不透明
 *         GTK_RELIEF_HALF   半透明
 *         GTK_RELIEF_NONE    透明
 */
void gtk_button_set_relief(GtkButton *button, GtkReliefStyle newstyle);
/**
 * 3.设置按钮文本在x、y方向上的偏移量
 * xalign:0.0 - 1.0
 * yalign:0.0 - 1.0
 */
 void gtk_button_set_alignment  (GtkButton      *button,
						         gfloat          xalign,
						         gfloat          yalign);
/**
 * 4.设置按钮是否被按下(只有复选、单选按钮支持)
 */
void gtk_toggle_button_set_active( GtkToggleButton *toggle_button,
                                   gboolean        state );

7 示例

#include 
#include 

void on_button_press(GtkWidget *item, gpointer data){
  g_print("%s is pressed.\n",(gchar *)data);
}

/**
 * @brief 从stock创建带有图片和标签的按钮
*/
GtkWidget* 
user_button_new_with_image_label_from_stock (gchar* stockid,gchar* title)
{ 
  GtkWidget *button;
  GtkWidget *image;
  GtkWidget *label;
  GtkWidget *hbox;
  image = gtk_image_new_from_stock(stockid,GTK_ICON_SIZE_MENU);
  label = gtk_label_new(title);
  hbox = gtk_hbox_new(FALSE,5);
  gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,0);
  gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);

  /* 添加一个快捷键标签 */
  label = gtk_label_new("Ctr + N");
  gtk_label_set_markup(GTK_LABEL(label), "Ctr + N");
  gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0);

  button = gtk_button_new();
  gtk_container_add(GTK_CONTAINER(button),hbox);

  return button;
}

/**
 * @brief 从文件创建带有图片和标签的按钮
*/
GtkWidget *
user_button_new_with_image_label_from_file(const gchar *filename, gchar *title){
  GtkWidget *button;
  GtkWidget *image;
  GtkWidget *label;
  GtkWidget *hbox;

  image = gtk_image_new_from_file(filename);
  label = gtk_label_new(title);

  hbox = gtk_hbox_new(FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);

  /* 添加一个快捷键标签 */
  label = gtk_label_new("Ctr + S");
  gtk_label_set_markup(GTK_LABEL(label), "Ctr + S");
  gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0);

  button = gtk_button_new();
  gtk_container_add(GTK_CONTAINER(button), hbox);

  return button;
}




int
main(int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *table;
  GtkWidget *hbox, *vbox, *label, *box;
  GtkWidget *separator;
  GtkWidget *opt, *menu, *item;
  GtkWidget *combo;
  GtkAccelGroup *accel_group;

  GtkObject *adj;
  GSList *group;
  GList *list;

  gtk_init(&argc, &argv);

  /* 创建主窗口 */
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Button Study");
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 500, 30);
  gtk_container_set_border_width(GTK_CONTAINER(window), 30);
  g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);

  /* 创建快捷键组 */
  accel_group = gtk_accel_group_new();
  gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);

  /* 创建一个纵向vbox放所有按钮 */
  vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  /*----------1.从文件创建带有图标和标签按钮-----------*/
  button = user_button_new_with_image_label_from_file("../ico/Set(16px).png", "设备管理");
  gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
    /*设定按键边框透明度*/
  gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
    /*绑定快捷键 */
  gtk_widget_add_accelerator(button, "clicked", accel_group,
                    GDK_KEY_S,GDK_CONTROL_MASK,GTK_ACCEL_VISIBLE);
  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_press), (gpointer)"设备管理");
    /*添加一个分割线 */
  separator = gtk_hseparator_new();
  gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0);

  /*-----------2.从系统stock创建一个带有图标和标签按钮----*/
  button = user_button_new_with_image_label_from_stock(GTK_STOCK_ADD, "添加设备");
  gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
  gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
    /*设定按键边框透明度*/
  gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
    /*绑定快捷键 */
  gtk_widget_add_accelerator(button, "clicked", accel_group,
                    GDK_KEY_N,GDK_CONTROL_MASK,GTK_ACCEL_VISIBLE);
  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_press), (gpointer)"添加设备");
    /*添加一个分割线 */
  separator = gtk_hseparator_new();
  gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0);

  /*-----------3.开关按钮------------*/
  button = gtk_toggle_button_new_with_label("激活界面");
  gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
    /*设定按键边框透明度*/
  gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
    /*设定标签位置*/
  gtk_button_set_alignment(GTK_BUTTON(button), 0.0, 0.5);
    /*添加一个分割线 */
  separator = gtk_hseparator_new();
  gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0);

  /*-----------4.复选按钮---------*/
    /*创建一个带有热键的复选按钮*/
  button = gtk_check_button_new_with_mnemonic("目标识别(_H)");
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
  gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
    /*添加一个分割线 */
  separator = gtk_hseparator_new();
  gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0);

  /*-----------5.单选按钮------------*/
  hbox = gtk_hbox_new(FALSE, 0);
  gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
    /*创建一个单选按钮,group此时还未知*/
  button = gtk_radio_button_new_with_label(NULL, "CSI摄像头");
  gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
    /*从上一个单选按钮组中,创建一个单选按钮*/
  button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), "网络摄像头");
  gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
    /*从上一个单选按钮组中,创建一个单选按钮*/
  button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), "USB摄像头");
    /*设置该按钮按下*/
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
  gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
    /*添加一个分割线 */
  separator = gtk_hseparator_new();
  gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0);

  /*-----------6.添加一个微调构件按钮---------*/
    /*创建微调对象*/
  adj = gtk_adjustment_new(2021,1900,2100,1,1,0);
    /*创建微调按钮*/
  button = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0.5, 0);
  gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
    /*设置微调按钮最大小值之间循环*/
  gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(button), TRUE);
  
#if 0
  /*----------6.选项菜单-------------*/
  opt = gtk_option_menu_new();
    /*创建一个菜单*/
  menu = gtk_menu_new();
  item = gtk_menu_item_new_with_label("行人识别");
  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
  item = gtk_menu_item_new_with_label("抽烟识别");
  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
  item = gtk_menu_item_new_with_label("摔倒识别");
  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);

  gtk_option_menu_set_menu(GTK_OPTION_MENU(opt), menu);
  gtk_box_pack_start(GTK_BOX(vbox), opt, TRUE, TRUE, 0);

  /*----------7.组合框--------------*/
  combo = gtk_combo_new();
  gtk_box_pack_start(GTK_BOX(vbox), combo, TRUE, TRUE, 0);
  list = g_list_append(list, "行人识别");
  list = g_list_append(list, "抽烟识别");
  list = g_list_append(list, "摔倒识别");
  gtk_combo_set_popdown_strings(GTK_COMBO(combo), list);
#endif

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

三、GTK-按钮(微调按钮、复选按钮、单选按钮)、快捷键、热键_第1张图片

参考

参考1: image stock缩略图
参考2:热键及快捷键(GtkAccelGroup)
参考3:GTK+ Reference Manual
参考4:GTK:微调构件
参考5:按钮构件API函数中文解释

你可能感兴趣的:(GTK-2.0,gtk/gtk+)