кнопки выбора или
«радио-кнопка» (radio buttons)
кнопки
выбора подобны контроль-кнопкам за
исключением того, что они создаются
группами и в отдельно взятый момент
времени может быть выбрана только одна
из них. это удобно там где нужно выбирать
из нескольких возможных взаимоисключающих
вариантов.
создание кнопок
выбора выполняется одним из этих вызовов:
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 );
|
вы
заметили наверное, что функции содержат
дополнительные аргументы. это нужно
для выполнения группой кнопок выбора
их обязанности должным образом. если
первый вызов gtk_radio_button_new() или
gtk_radio_button_new_with_label() должен содержать null
в качестве первого аргумента, то
используйте:
gslist *gtk_radio_button_get_group( gtkradiobutton *radio_button );
|
важно
помнить, что gtk_radio_button_get_group() вызывается
каждый раз, когда нужно добавить кнопку
выбора в группу, используя в качестве
аргумента предыдущую кнопку выбора.
результат передаётся в следующий вызов
gtk_radio_button_new() или gtk_radio_button_new_with_label(). это
позволяет связать цепь кнопок выбора.
пример ниже проясняет это.
вы можете немного
сократить синтаксис, удалив переменную
для содержания списка кнопок выбора:
button2 = gtk_radio_button_new_with_label(
gtk_radio_button_get_group (gtk_radio_button (button1)),
"button2");
|
варианты
с _from_widget() позволяют создавать сокращенные
функции в будущем, опуская вызов
gtk_radio_button_get_group(). эта форма используется
для создания третьей кнопки в следующем
примере:
button2 = gtk_radio_button_new_with_label_from_widget(
gtk_radio_button (button1),
"button2");
|
также хорошей идеей
может быть установка по умолчанию
определяющая выбранную кнопку:
void gtk_toggle_button_set_active( gtktogglebutton *toggle_button,
gboolean state );
|
это
описано в секции о переключателях и
работает таким же образом. как только
кнопки выбора сгруппированы, только
одна из них может быть выбрана. если
пользователь нажмет сначала на одну
кнопку выбора, а затем на другую, то
первая создаст сигнал "toggled" (сообщит
о переходе в неактивное состояние), а
вторая создаст "toggled" сигнал
сообщая об активизации.
пример создания
группы из трёх кнопок выбора.

#include <glib.h>
#include <gtk/gtk.h>
gint close_application( gtkwidget *widget,
gdkevent *event,
gpointer data )
{
gtk_main_quit ();
return false;
}
int main( int argc,
char *argv[] )
{
gtkwidget *window = null;
gtkwidget *box1;
gtkwidget *box2;
gtkwidget *button;
gtkwidget *separator;
gslist *group;
window = gtk_window_new (gtk_window_toplevel);
g_signal_connect (g_object (window), "delete_event",
g_callback (close_application),
null);
gtk_window_set_title (gtk_window (window), "radio buttons");
gtk_container_set_border_width (gtk_container (window), 0);
box1 = gtk_vbox_new (false, 0);
gtk_container_add (gtk_container (window), box1);
gtk_widget_show (box1);
box2 = gtk_vbox_new (false, 10);
gtk_container_set_border_width (gtk_container (box2), 10);
gtk_box_pack_start (gtk_box (box1), box2, true, true, 0);
gtk_widget_show (box2);
button = gtk_radio_button_new_with_label (null, "button1");
gtk_box_pack_start (gtk_box (box2), button, true, true, 0);
gtk_widget_show (button);
group = gtk_radio_button_get_group (gtk_radio_button (button));
button = gtk_radio_button_new_with_label (group, "button2");
gtk_toggle_button_set_active (gtk_toggle_button (button), true);
gtk_box_pack_start (gtk_box (box2), button, true, true, 0);
gtk_widget_show (button);
button = gtk_radio_button_new_with_label_from_widget (gtk_radio_button (button),
"button3");
gtk_box_pack_start (gtk_box (box2), button, true, true, 0);
gtk_widget_show (button);
separator = gtk_hseparator_new ();
gtk_box_pack_start (gtk_box (box1), separator, false, true, 0);
gtk_widget_show (separator);
box2 = gtk_vbox_new (false, 10);
gtk_container_set_border_width (gtk_container (box2), 10);
gtk_box_pack_start (gtk_box (box1), box2, false, true, 0);
gtk_widget_show (box2);
button = gtk_button_new_with_label ("close");
g_signal_connect_swapped (g_object (button), "clicked",
g_callback (close_application),
g_object (window));
gtk_box_pack_start (gtk_box (box2), button, true, true, 0);
gtk_widget_set_flags (button, gtk_can_default);
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main ();
return 0;
}
|
|