Книга: Основы программирования в Linux

GtkButton

GtkButton

Вы уже видели виджет кнопки GtkButton в действии, но существует несколько виджетов, потомков GtkButton, с чуть большими функциональными возможностями, заслуживающими упоминания.

GtkButton
 +----GtkToggleButton
       +----GtkCheckButton
             +----GtkRadioButton

Как видно из иерархии виджетов, кнопка-переключатель типа GtkToggleButton — прямой потомок кнопки GtkButton, кнопка-флажок GtkCheckButton — кнопки-выключателя GtkToggleButton и то же самое для переключателя GtkRadioButton, причем каждый дочерний виджет предназначен для определенных задач.

GtkToggleButton

Виджет GtkToggleButton идентичен виджету GtkButton за исключением одной важной детали: GtkToggleButton обладает состоянием. Это означает, что кнопка-выключатель может быть включена или выключена. Когда пользователь щелкает мышью виджет GtkToggleButton, последний стандартным способом порождает сигнал clicked и изменяет (или "переключает") свое состояние.

API у виджета GtkToggleButton очень простой:

GtkWidget* gtk_toggle_button_new(void);
GtkWidget* gtk_toggle_button_new_with_label(const gchar* label);
gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button);
void gtk_toggle_button_set_active(GtkToggleButton *toggle_button,
 gboolean is_active);

Наиболее интересные функции — gtk_toggle_button_get_active и gtk_toggle_button_set_active, которые вы вызываете для чтения и установки состояния кнопки-выключателя. Если характеристика функционирования равна TRUE, это означает, что кнопка-выключатель GtkToggleButton включена.

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 <gtk/gtk.h>
#include <stdio.h>
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 %sn", 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 четырех часто применяемых типов.


Рис. 16.10

Щелкните мышью кнопку OK, чтобы увидеть состояние разных кнопок.

Данная программа — простой пример использования кнопок GtkButton четырех типов — показывает, как можно считать состояние кнопки типа GtkToggleButton, GtkCheckButton и GtkRadioButton с помощью единственной функции gtk_toggle_button_get_active. Это одно из огромных преимуществ объектно-ориентированного подхода — поскольку вам не нужны отдельные функции get_active для каждого типа кнопки, вы можете сократить требующийся программный код.

Оглавление книги

Оглавление статьи/книги

Генерация: 2.251. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз