23.4.3. Переключатели
23.4.3. Переключатели
Переключатели бывают двух типов: зависимые (radio buttons) и независимые (checkbuttons). Переключатели являются кнопками, поэтому для них характерны те же события, что и для кнопок.
Начнем с независимых переключателей, так как они проще в реализации. Создать такой переключатель можно с помощью одной из функций:
GtkWidget *gtk_check_button_new(void);
GtkWidget *gtk_check_button_new_with_label(gchar * label);
Первая создает переключатель без надписи (если вы хотите указать надпись отдельно), а вторая — с надписью, которая обычно отображается справа от переключателя. Затем нужно, как всегда, поместить виджиты в контейнер и отобразить.
Зависимые переключатели можно создать тоже с помощью двух аналогичных функций:
GtkWidget *gtk_radio_button_new(GSList *group);
GtkWidget *gtk_radio_button_new_with_label(GSList *group,
gchar *label);
Параметр group указывает на принадлежность переключателя к группе. В пределах группы активным может быть только один переключатель. Группу можно создать функцией:
GSList *gtk_radio_button_group(
GtkRadioButton *radio_button);
Однако существует другой способ, позволяющий обойтись без переменной группы — так мы сэкономим память, если групп много:
button2 = gtk_radio_button_new_with_label(
gtk_radio_button_group(GTK_RADIO_BUTTON(button1)),
"button2");
С помощью функции
void gtk_toggle_button_set_active(
GtkToggleButton *toggle_button, gint state);
можно сделать одну из кнопок активной.
Следующий листинг демонстрирует работу с тремя зависимыми переключателями и вертикальным контейнером GtkVBox.
Листинг 23.7. Зависимые переключатели
#include <gtk/gtk.h>
#include <glib.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;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(window), "delete_event",
GTK_SIGNAL_FUNC(close_application), NULL);
gtk_window_set_title(GTK_WINDOW(window),
"Выберите дистрибутив");
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, "Red Hat");
gtk_box_pack_start(GTK_BOX(box2), button,
TRUE, TRUE, 0);
gtk_widget_show(button);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
button =
gtk_radio_button_new_with_label(group, "Mandrake");
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(
gtk_radio_button_group(GTK_RADIO_BUTTON(button)),
"ALT Linux");
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("OK");
gtk_signal_connect_object(GTK_OBJECT (button),
"clicked", GTK_SIGNAL_FUNC(close_application),
GTK_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);
}
Рис. 23.4. Зависимые переключатели
Данный текст является ознакомительным фрагментом.