主要部分的程序都是一样的,Gtk系统自带图标和用户导入图标的不同之处,主要是导入image的方式。
button
└──hbox
├── image
└── label
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;
}
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;
}
首先要区分一下热键快捷键
热键:一般是字母带下划线,在当前控件按钮,可以用Alt + 字母
来代替点击的功能。
快捷键:一般指,在本窗口任何位置内,按某组合键(随意组合)
都可以代替点击的功能。
在想设为的热键字母前加一个下划线,这与其它语言也是有很大差异的.其它所有我了解的语言中,都是用"&"+字母来设定热键的,而这里是""+字母.当然,你有可能会在字符中使用"“这个字符本身.这时,你可以用”__“连续的两个下划线来实现.在显示时,就会显示出字符”_".
GtkWidget* gtk_button_new_with_mnemonic (const gchar *label);
eg.
button = gtk_button_new_with_mnemonic("消息热键(_H)");
button = gtk_button_new_with_mnemonic("_message");
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);
开关按钮由一般按钮派生而来,并且非常相似,只是开关按钮有两个状态,通过点击可以切换。它们可以是被按下的(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 );
复选按钮左边是有一个小的方框,而文字是在其右边。常用在应用程序中以切换各选项的开和关。
/*创建普通复选按钮*/
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 );
单选按钮与复选按钮相似,只是单选按钮是分组的,在一组中只有一个处于选中/按下状态。这在你的应用程序中要从几个选项中选一个的地方可以用到。
/*创建一个单选按钮,创建一个组的第一个复选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);
/* @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);
/* 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 );
#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;
}
参考1: image stock缩略图
参考2:热键及快捷键(GtkAccelGroup)
参考3:GTK+ Reference Manual
参考4:GTK:微调构件
参考5:按钮构件API函数中文解释