本节示例将介绍如何创建和使用单选按钮控件,并利用它创建一个多项选一的窗口以及如何判断用户的选择。
每个单选按钮都是一组单选按钮的成员。当一个单选按钮被选中时,同一组中的所有其他单选按钮将被取消选中。GtkRadioButton是让用户从众多选项中做出选择的一种方式。
单选按钮部件使用gtk_radio_button_new()创建,如果这是组中的第一个单选按钮,则传递NULL作为参数。在后续调用中,您希望将此按钮添加到的组应该作为参数传递。如果您希望单选按钮上有一个文本标签,可以选择使用gtk_radio_button_new_with_label()。
或者,在向现有的单选按钮组添加小部件时,使用gtk_radio_button_new_from_widget()和已经分配了一个组的GtkRadioButton。还提供了方便的函数gtk_radio_button_new_with_label_from_widget()。
要检索分配给GtkRadioButton的组,请使用gtk_radio_button_get_group()。
要从一个组中删除一个GtkRadioButton,并使其成为一个新组的一部分,请使用gtk_radio_button_set_group()。
不需要释放组列表,因为每个GtkRadioButton在销毁时将删除自身及其列表项。
单选按钮(GtkRadioButton)控件经常用来表示程序中有多种情况只有一种情况的用户选择,此示例就创建了4个单选按钮代表颜色,用户只能选择其中一种颜色。
/*randiobutton.c*/
#include<gtk/gtk.h>
staticgchar *red="红色";
staticgchar *green="绿色";
staticgchar *yellow="黄色";
staticgchar *blue="蓝色";
voidon_radio_clicked(GtkWidget *radio, gintdata)
{
g_print("你选的颜色是:");
switch((int)data)
{
case1:
g_print("%s\n",red);
break;
case2:
g_print("%s\n",green);
break;
case3:
g_print("%s\n",yellow);
break;
case4:
g_print("%s\n",blue);
break;
default:
break;
}
}
intmain(intargc,char*argv[])
{
GtkWidget * window;
GtkWidget * frame;
GtkWidget * box;
GtkWidget * box1;
GtkWidget * button1;
GtkWidget * radio1;
GtkWidget * radio2;
GtkWidget * radio3;
GtkWidget * radio4;
GSList * group;
gchar * title ="单项选择窗口";
gtk_init(&argc, &argv);
window =gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), title);
gtk_container_set_border_width(GTK_CONTAINER(window),10);
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);
box =gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
gtk_container_add(GTK_CONTAINER(window), box);
frame =gtk_frame_new("请选择一种颜色:");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_OUT);
gtk_box_pack_start(GTK_BOX(box), frame,FALSE,FALSE,5);
box1 =gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
gtk_container_set_border_width(GTK_CONTAINER(box1),10);
gtk_container_add(GTK_CONTAINER(frame), box1);
radio1 =gtk_radio_button_new_with_label(NULL,red);//红色
g_signal_connect(G_OBJECT(radio1),"released",G_CALLBACK(on_radio_clicked), (gpointer)1);
gtk_box_pack_start(GTK_BOX(box1), radio1,FALSE,FALSE,5);
//创建多选按钮组
group =gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio1));
radio2 =gtk_radio_button_new_with_label(group,green);//绿色
g_signal_connect(G_OBJECT(radio2),"released",G_CALLBACK(on_radio_clicked), (gpointer)2);
gtk_box_pack_start(GTK_BOX(box1), radio2,FALSE,FALSE,5);
group =gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio2));
radio3 =gtk_radio_button_new_with_label(group,yellow);//绿色
g_signal_connect(G_OBJECT(radio3),"released",G_CALLBACK(on_radio_clicked), (gpointer)3);
gtk_box_pack_start(GTK_BOX(box1), radio3,FALSE,FALSE,5);
group =gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio3));
radio4 =gtk_radio_button_new_with_label(group,blue);//绿色
g_signal_connect(G_OBJECT(radio4),"released",G_CALLBACK(on_radio_clicked), (gpointer)3);
gtk_box_pack_start(GTK_BOX(box1), radio4,FALSE,FALSE,5);
group =gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio4));
button1 =gtk_button_new_with_label("确定");
g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(gtk_main_quit),NULL);
gtk_box_pack_start(GTK_BOX(box), button1,FALSE,FALSE,5);
gtk_widget_show_all(window);
gtk_main();
returnFALSE;
}
代码分析:
(1) 创建单选按钮
创建单选按钮有多个函数,每个函数的第一个参数都是单向链表(GSList)类型的,表示单选按钮所属的组,在创建一组中的第一个单选按钮时,可以将此参数设为NULL,而余下的单选按钮在创建时首先要用gtk_radio_button_get_group函数来取得第一个按钮所属的组,再用此组做参数来创建单选按钮。还可以用gtk_radio_button_set_group函数来设定单选按钮所属的组。
除了上述方式外,还可以用函数gtk_radio_button_new_from_widget来依次创建一组单选按钮,它的参数是前一单选按钮的控件指针,有兴趣的读者可以自己试一试。
(2) 单选按钮的信号
本例中为单选按钮的“clicked”信号加回调函数来显示用户的选择,这是最容易理解的一种方式,读者还可以用上节中的“released”信号来处理用户的选择。
单选按钮是继承自多选按钮的,单个的单选按钮和多选按钮在功能上是一样的,理解这一点对运用按钮类控件来编程非常重要。
本文暂时没有评论,来添加一个吧(●'◡'●)