GtkCheckButton
Кнопка-флажок GtkCheckButton
— это замаскированная кнопка-выключатель GtkToggleButton
. Вместо скучного прямоугольного отображения GtkToggleButton
кнопка GtkCheckButton
выводится как привлекательный флажок с расположенным рядом текстом. Функциональных различий между ними нет.
GtkWidget* gtk_check_button_new(void);
GtkWidget* gtk_check_button_new_with_label(const gchar *label);
GtkRadioButton
Эта кнопка немного отличается от предыдущих, т.к. может группироваться с другими кнопками того же типа. Переключатель (или радиокнопка) GtkRadioButton
— одна из тех кнопок, которые позволяют выбирать только один вариант из группы предложенных. Имя заимствовано у старых радиоприемников с механическими кнопками, которые выскакивали с треском, возвращаясь в прежнее состояние, при нажатии другой кнопки.
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);
void gtk_radio_button_set_group(GtkRadioButton *radio_button, GSList *group);
GSList* gtk_radio_button_get_group(GtkRadioButton *radio_button);
Группа переключателей представлена в объекте-списке библиотеки GLib, названном GSList
. Для того чтобы объединить переключатели в группу, вы можете создать объект GSList
и затем передать ему каждую кнопку с помощью функций gtk_radio_button_new
и gtk_radio_button_get_group
, есть и более легкий способ в виде функции gtk_radio_button_new_with_widget
, которая включает в GSList существующую кнопку. Вы увидите ее в действии в упражнении 16.6, которое позволит вам опробовать разные кнопки GtkButton
.
Упражнение 16.6. GtkCheckButton
, GtkToggleButton
и GtkRadioButton
Введите следующий текст в файл с именем buttons.с.
1. Сначала объявите указатели на кнопки как глобальные переменные:
#include
#include
GtkWidget *togglebutton;
GtkWidget *checkbutton;
GtkWidget *radiobutton1, *radiobutton2;
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit();
}
2. Далее определите вспомогательную функцию, которая упаковывает GtkWidget
и GtkLabel
в контейнер GtkHbox
и затем вставляет этот GtkHbox
в заданный виджет- контейнер. Это поможет вам сократить повторяющийся программный код:
void add_widget_with_label(GtkContainer * box, gchar * caption,
GtkWidget * widget) {
GtkWidget *label = gtk_label_new(caption);
GtkWidget *hbox = gtk_hbox_new(TRUE, 4);
gtk_container_add(GTK_CONTAINER(hbox), label);
gtk_container_add(GTK_CONTAINER(hbox), widget);
gtk_container_add(box, hbox);
}
3. print_active
— еще одна вспомогательная функция, которая выводит текущее состояние заданной кнопки-выключателя GtkToggleButton
со строкой описания. Он вызывается из функции button_clicked
, функции обратного вызова, связанной с сигналом clicked
кнопки OK.При каждом щелчке мышью этой кнопки вы получаете на экране отчет о состоянии кнопок:
void print_active(char * button_name, GtkToggleButton* button) {
gboolean active = gtk_toggle_button_get_active(button);
printf("%s is %s\n", button_name, active?"active":"not active");
}
void button_clicked(GtkWidget *button, gpointer data) {
print_active("Checkbutton", GTK_TOGGLE_BUTTON(checkbutton));
print_active("Togglebutton", GTK_TOGGLE_BUTTON(togglebutton));
print_active("Radiobutton1", GTK_TOGGLE_BUTTON(radiobutton1));
print_active("Radiobutton2", GTK_TOGGLE_BUTTON(radiobutton2));
printf("\n");
}
4. В функции main
вы создаете виджеты кнопок, поочередно помещаете их в контейнер GtkVBox
, добавив пояснительные метки, и связываете сигнал обратного вызова с кнопкой OK:
gint main(gint argc, gchar *argv[]) {
GtkWidget* window;
GtkWidget *button;
GtkWidget *vbox;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
g_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(closeApp), NULL);
button = gtk_button_new_with_label("Ok");
togglebutton = gtk_toggle_button_new_with_label("Toggle");
checkbutton = gtk_check_button_new();
radiobutton1 = gtk_radio_button_new(NULL);
radiobutton2 =
gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(radiobutton1));
vbox = gtk_vbox_new(TRUE, 4);
add_widget_with_label(GTK_CONTAINER(vbox), "ToggleButton:",
togglebutton);
add_widget_with_label(GTK_CONTAINER(vbox), "CheckButton:",
checkbutton);
add_widget_with_label(GTK_CONTAINER(vbox), "Radio 1:", radiobutton1);
add_widget_with_label(GTK_CONTAINER(vbox), "Radio 2:", radiobutton2);
add_widget_with_label(GTK_CONTAINER(vbox), "Button:", button);
g_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(button_clicked), NULL);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
На рис. 16.10 показана программа buttons.c в действии с виджетами GtkButton
четырех часто применяемых типов.
Читать дальше