GTK+中文社区(gtk.awaysoft.com)

 找回密码
 马上加入

QQ登录

只需一步,快速开始

查看: 3194|回复: 2

2.4检查按钮和选择按钮

[复制链接]
  • TA的每日心情
    奋斗
    2015-10-16 12:17
  • 签到天数: 401 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-9-14 00:35:43 | 显示全部楼层 |阅读模式
    检查按钮就是我们通常来说的复选框。检查按钮(checkbutton,GtkCheckButton)由触发按钮(GtkToggleButton)派生而来。GtkCheckButton的表现类似GtkToggleButton。两者的主要差别是按钮在屏幕上的显示方式不同。两种构件完成同样的功能,选择哪一种按钮纯粹是用户爱好。

    所以所以我们将gtktogglebutton的例子改一下就可以成为gtkcheckbutton的例子了,如以下代码所示

    1. <P> #include <gtk/gtk.h></P>
    2. <P>void button_toggled(GtkWidget *widget,gpointer *data)
    3. {
    4.     //在终端中打印
    5.     if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))==TRUE)
    6.     g_printf("button checked!!!\n");
    7.     else
    8.     g_printf("button unchecked!!!\n");
    9. }</P>
    10. <P>int main (void)
    11. {
    12.     GtkWidget *window = NULL;
    13.     GtkWidget *button = NULL;
    14.     // 初始化 GTK
    15.     gtk_init(NULL, NULL);
    16.     // 建立一個新的 GtkWindow
    17.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    18.     //建立一个新的button
    19.     //button = gtk_button_new ();
    20.     button = gtk_check_button_new_with_label ("check button");
    21.     // 設置標題
    22.     gtk_window_set_title (GTK_WINDOW (window), "Window");
    23.     // 設置默認大小
    24.     gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    25.     //将button放置到window容器中
    26.     gtk_container_add(GTK_CONTAINER(window),button);
    27.     // 處理 "destroy" 信號,當窗口被關閉時退出程序
    28.     g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    29.     g_signal_connect (button, "toggled", G_CALLBACK (button_toggled), NULL);
    30.     // 顯示窗口和所有子組件
    31.     gtk_widget_show_all (window);
    32.     // 開始事件循環
    33.     gtk_main ();
    34.     // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    35.     return 0;
    36. }
    37. </P>
    复制代码
    显示效果如下图:


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?马上加入

    x
  • TA的每日心情
    奋斗
    2015-10-16 12:17
  • 签到天数: 401 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-9-14 00:36:03 | 显示全部楼层
    本帖最后由 白浪 于 2013-9-14 01:17 编辑

    选择按钮就是我们通常来说的单选框。从外观来看,选择按钮(GtkRaddioButton)很像检查按钮。因为选
    择按钮是从检查按钮派生而来的。选择按钮和检查按钮的区别不大,对选择按钮来说,任何时候在一组按
    钮只可以选择一个按钮,点击一个按钮就释放前面选择的按钮,使点击的按钮成为被选择的按钮。

    可以用gtk_radio_hutton_new_with_label函数建立带标号的GtkRadioButton,或者用gtk_radio_button_new
    函数建立不带标号的GtkRadioButton。建立GtkRadioButton只完成了工作的一半。因为选择按钮必须和组
    联系起来,使得任何时候只能选择一个按钮。

    以下代码是创建了3个选择按钮,并将3个选择按钮加入了同一个组中,使得3个选择按钮在任何时候只能选择一个按钮。

    1. <P> #include <gtk/gtk.h></P>
    2. <P> </P>
    3. <P>int main (void)
    4. {
    5.     GtkWidget *window = NULL;
    6.     GtkWidget *button1 = NULL;
    7.     GtkWidget *button2 = NULL;
    8.     GtkWidget *button3 = NULL;
    9.     GtkWidget *fixed = NULL;
    10.     GSList  *group=NULL;
    11.     // 初始化 GTK
    12.     gtk_init(NULL, NULL);
    13.     // 建立一個新的 GtkWindow
    14.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    15.     fixed=gtk_fixed_new();
    16.     //建立一个新的button
    17.     //button = gtk_button_new ();
    18.     button1 = gtk_radio_button_new_with_label (group,"check button1");
    19.     group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1));
    20.     button2 = gtk_radio_button_new_with_label (group,"check button2");
    21.     group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button2));
    22.     button3 = gtk_radio_button_new_with_label (group,"check button3");</P>
    23. <P>    gtk_fixed_put(GTK_FIXED(fixed),button1,40,20);
    24.     gtk_fixed_put(GTK_FIXED(fixed),button2,40,40);
    25.     gtk_fixed_put(GTK_FIXED(fixed),button3,40,60);
    26.     // 設置標題
    27.     gtk_window_set_title (GTK_WINDOW (window), "Window");
    28.     // 設置默認大小
    29.     gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    30.     gtk_container_add(GTK_CONTAINER(window),fixed);
    31.     // 處理 "destroy" 信號,當窗口被關閉時退出程序
    32.     g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    33. //    g_signal_connect (button, "toggled", G_CALLBACK (button_toggled), NULL);
    34.     // 顯示窗口和所有子組件
    35.     gtk_widget_show_all (window);
    36.     // 開始事件循環
    37.     gtk_main ();
    38.     // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    39.     return 0;
    40. }
    41. </P>
    复制代码
    每添加一个选择按钮后都得调用一次gtk_radio_button_get_group函数取得组,然后继续添加按钮。如果不这样
    做将导致不可预期的结果。



    以下代码是加了回调之后的代码,就不解释了哈 有问题就提问哈
    1. #include <gtk/gtk.h>

    2. void button_toggled(GtkWidget *widget,gpointer *data)
    3. {
    4. //在终端中打印
    5. if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))==TRUE)
    6. {
    7. if(data==1)g_printf("button1 checked!!!\n");
    8. else if(data==2)g_printf("button2 checked!!!\n");
    9. else if(data==3)g_printf("button3 checked!!!\n");

    10. }
    11. }

    12. int main (void)
    13. {
    14. GtkWidget *window = NULL;
    15. GtkWidget *button1 = NULL;
    16. GtkWidget *button2 = NULL;
    17. GtkWidget *button3 = NULL;
    18. GtkWidget *fixed = NULL;
    19. GSList *group=NULL;
    20. // 初始化 GTK
    21. gtk_init(NULL, NULL);
    22. // 建立一個新的 GtkWindow
    23. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    24. fixed=gtk_fixed_new();
    25. //建立一个新的button
    26. //button = gtk_button_new ();
    27. button1 = gtk_radio_button_new_with_label (group,"check button1");
    28. group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1));
    29. button2 = gtk_radio_button_new_with_label (group,"check button2");
    30. group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button2));
    31. button3 = gtk_radio_button_new_with_label (group,"check button3");

    32. gtk_fixed_put(GTK_FIXED(fixed),button1,40,20);
    33. gtk_fixed_put(GTK_FIXED(fixed),button2,40,40);
    34. gtk_fixed_put(GTK_FIXED(fixed),button3,40,60);
    35. // 設置標題
    36. gtk_window_set_title (GTK_WINDOW (window), "Window");
    37. // 設置默認大小
    38. gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    39. gtk_container_add(GTK_CONTAINER(window),fixed);
    40. // 處理 "destroy" 信號,當窗口被關閉時退出程序
    41. g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    42. g_signal_connect (button1, "toggled", G_CALLBACK (button_toggled), (gpointer)1);
    43. g_signal_connect (button2, "toggled", G_CALLBACK (button_toggled), (gpointer)2);
    44. g_signal_connect (button3, "toggled", G_CALLBACK (button_toggled), (gpointer)3);
    45. // 顯示窗口和所有子組件
    46. gtk_widget_show_all (window);
    47. // 開始事件循環
    48. gtk_main ();
    49. // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    50. return 0;
    51. }

    复制代码
    效果如下图:


    作业:
    将控制台打印的内容以label的形式显示在窗口上

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?马上加入

    x
    *滑块验证:
    您需要登录后才可以回帖 登录 | 马上加入

    本版积分规则

    申请友链|Archiver|小黑屋|手机版|GTK+中文社区 ( 粤ICP备13080851号 )

    我要啦免费统计

    GMT+8, 2024-11-1 09:22 , Processed in 0.025394 second(s), 9 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表