GTK+学习笔记3——按钮构件

GTK+ 的按钮构件有很多种,常用的有如下四个:

GtkButton:普通按钮

GtkToggleButton:开关按钮

GtkCheckButton:复选按钮

GtkRadioButton:单选按钮

这四个构件的继承关系如下:



GtkButton:

GtkButton就是普通的按钮,带有多种信号,常用的有以下三种:

leave:鼠标离开按钮时触发的信号;

pressed:鼠标按下按钮时触发的信号;

clicked:鼠标松开时触发的信号。

下面这里例子会新建一个按钮,当触发不同信号时,会在终端打印相应的信息:

[cpp]  view plain copy
  1. #include <gtk/gtk.h>  
  2.   
  3. void close_app(GtkWidget *window , gpointer data)  
  4. {  
  5.     gtk_main_quit();  
  6. }  
  7.   
  8. void button_leave(GtkWidget *button,gpointer data)  
  9. {  
  10.     printf("button leave\n");  
  11. }  
  12.   
  13. void button_pressed(GtkWidget *button,gpointer data)  
  14. {  
  15.     printf("button pressed\n");  
  16. }  
  17.   
  18. void button_clicked(GtkWidget *button,gpointer data)  
  19. {  
  20.     printf("button clicked\n");  
  21. }  
  22.   
  23. int main(int argc,char *argv[])  
  24. {  
  25.     GtkWidget *window;  
  26.     GtkWidget *button;  
  27.   
  28.     gtk_init(&argc,&argv);  
  29. //新建一个窗口  
  30.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  31.     gtk_window_set_title(GTK_WINDOW(window),"button demo");  
  32.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  33.     gtk_window_set_default_size(GTK_WINDOW(window),200,200);  
  34.     g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(close_app),NULL);  
  35.   
  36. //新建一个按钮  
  37.     button = gtk_button_new_with_label("button");  
  38. //鼠标离开按钮时触发leave信号  
  39.     g_signal_connect(GTK_OBJECT(button),"leave",G_CALLBACK(button_leave),NULL);  
  40. //鼠标按下按钮时触发pressed信号  
  41.     g_signal_connect(GTK_OBJECT(button),"pressed",G_CALLBACK(button_pressed),NULL);  
  42. //鼠标松开是触发clicked信号  
  43.     g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(button_clicked),NULL);  
  44.   
  45. //将按钮放入窗口中  
  46.     gtk_container_add(GTK_CONTAINER(window),button);  
  47.     gtk_widget_show_all(window);  
  48.     gtk_main();  
  49.     return 0;  
  50. }  


GtkToggleButton:

开关按钮的特点是有两个状态:开和关。点击一次,按钮被按下(TRUE),再点击一次,按钮会弹起(FALSE)。当点击开关按钮时,会发出toggle信号。可以用如下函数获取开关按钮的状态:

[cpp]  view plain copy
  1. gboolean    gtk_toggle_button_get_active   (GtkToggleButton *toggle_button);  
例子:
[cpp]  view plain copy
  1. #include <gtk/gtk.h>  
  2.   
  3. void close_app(GtkWidget *window,gpointer data)  
  4. {  
  5.     gtk_main_quit();  
  6. }  
  7.   
  8. void toggle_button_callback(GtkWidget *toggle,gpointer data)  
  9. {  
  10.     if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))  
  11.     {  
  12.     //改变按钮的标签  
  13.     gtk_button_set_label(GTK_BUTTON(toggle),"toggle button down");  
  14.     }  
  15.     else  
  16.     {  
  17.     gtk_button_set_label(GTK_BUTTON(toggle),"toggle button up");  
  18.     }  
  19. }  
  20.   
  21. int main(int argc, char *argv[])  
  22. {  
  23.     GtkWidget *window;  
  24.     GtkWidget *toggle;  
  25.   
  26.     gtk_init(&argc,&argv);  
  27. //新建一个窗口  
  28.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  29.     gtk_window_set_title(GTK_WINDOW(window),"toggle button demo");  
  30.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  31.     gtk_window_set_default_size(GTK_WINDOW(window),200,200);  
  32.     g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(close_app),NULL);  
  33. //新建一个按钮  
  34.     toggle = gtk_toggle_button_new_with_label("toggle button up");  
  35.     g_signal_connect(GTK_OBJECT(toggle),"toggled",G_CALLBACK(toggle_button_callback),NULL);  
  36.   
  37.     gtk_container_add(GTK_CONTAINER(window),toggle);  
  38.   
  39.     gtk_widget_show_all(window);  
  40.     gtk_main();  
  41.   
  42.     return 0;  
  43. }  

GtkCheckButton:

多选按钮继承了开关按钮的特性,也是两种状态:选中或未选,与开关按钮使用同样的信号和函数获取状态。

例子:

[cpp]  view plain copy
  1. #include <gtk/gtk.h>  
  2.   
  3. void close_app(GtkWidget *window, gpointer data)  
  4. {  
  5.     gtk_main_quit();  
  6. }  
  7.   
  8. void check_button_callback(GtkWidget *check_button, gpointer data)  
  9. {  
  10.     if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button)))  
  11.     {  
  12.     printf("check button selected\n");  
  13.     }  
  14.     else  
  15.     {  
  16.     printf("check button unselected\n");  
  17.     }  
  18. }  
  19.   
  20. int main(int argc,char *argv[])  
  21. {  
  22.     GtkWidget *window;  
  23.     GtkWidget *check_button;  
  24.   
  25.     gtk_init(&argc,&argv);  
  26. //新建一个窗口  
  27.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  28.     gtk_window_set_title(GTK_WINDOW(window),"check button demo");  
  29.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  30.     gtk_window_set_default_size(GTK_WINDOW(window),200,200);  
  31.     g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(close_app),NULL);  
  32. //新建一个多选按钮  
  33.     check_button = gtk_check_button_new_with_label("check button 1");  
  34.     g_signal_connect(GTK_OBJECT(check_button),"toggled",G_CALLBACK(check_button_callback),NULL);  
  35.   
  36.     gtk_container_add(GTK_CONTAINER(window),check_button);  
  37.     gtk_widget_show_all(window);  
  38.     gtk_main();  
  39.       
  40.     return 0;  
  41. }  


GtkRadioButton:

单选按钮继承了多选按钮,同样可以使用toggle信号和gtk_toggle_button_get_active函数获取状态。与多选按钮不同,单选按钮需要分组,同组内的多个单选按钮只能选中一个。可以用如下函数创建一个单选按钮:

[cpp]  view plain copy
  1. GtkWidget *   gtk_radio_button_new  (GSList *group);  
单选按钮必须要加入一个组:

[cpp]  view plain copy
  1. void    gtk_radio_button_set_group   (GtkRadioButton *radio_button,    GSList *group);  
例子:

[cpp]  view plain copy
  1. #include <gtk/gtk.h>  
  2.   
  3. void close_app(GtkWidget *window,gpointer data)  
  4. {  
  5.     gtk_main_quit();  
  6. }  
  7.   
  8. int main(int argc,char *argv[])  
  9. {  
  10.     GtkWidget *window;  
  11.     GSList *radio_group;  
  12.     GtkWidget *radio_button1;  
  13.     GtkWidget *radio_button2;  
  14.     GtkWidget *Vbox;  
  15.   
  16.     gtk_init(&argc,&argv);  
  17. //新建一个窗口  
  18.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  19.     gtk_window_set_title(GTK_WINDOW(window),"radio button demo");  
  20.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  21.     gtk_window_set_default_size(GTK_WINDOW(window),200,200);  
  22.     g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(close_app),NULL);  
  23.   
  24. //新建两个单选按钮  
  25.     radio_button1 = gtk_radio_button_new_with_label(NULL,"radio button 1");  
  26.     radio_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button1));  
  27.     radio_button2 = gtk_radio_button_new_with_label(radio_group,"radio button 2");  
  28.   
  29.     Vbox = gtk_vbox_new(FALSE,0);  
  30.     gtk_box_pack_start(GTK_BOX(Vbox),radio_button1,FALSE,FALSE,0);  
  31.     gtk_box_pack_start(GTK_BOX(Vbox),radio_button2,FALSE,FALSE,0);  
  32.   
  33.     gtk_container_add(GTK_CONTAINER(window),Vbox);  
  34.     gtk_widget_show_all(window);  
  35.     gtk_main();  
  36.     return 0;  
  37. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值