GTK+ — 7. Прапорці та комбіновані списки
Квітень 22nd, 2009Продовжуємо огляд віджетів основних елементів графічного користувацького інтерфейсу. Цього разу про кнопки-прапорці та комбіновані списки.
GtkCheckButton
GtkCheckButton — віджет, який має два стани: увімкнено і вимкнено. Стан “увімкнено” візуально відтворюється, як встановлений прапорець.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <gtk/gtk.h> void toggle_title(GtkWidget *widget, gpointer window) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { gtk_window_set_title(window, "GtkCheckButton"); } else { gtk_window_set_title(window, ""); } } int main(int argc, char** argv) { GtkWidget *window; GtkWidget *frame; GtkWidget *check; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); gtk_window_set_title(GTK_WINDOW(window), "GtkCheckButton"); frame = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window), frame); check = gtk_check_button_new_with_label("Show title"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); GTK_WIDGET_UNSET_FLAGS(check, GTK_CAN_FOCUS); gtk_fixed_put(GTK_FIXED(frame), check, 50, 50); g_signal_connect_swapped(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(check, "clicked", G_CALLBACK(toggle_title), (gpointer) window); gtk_widget_show_all(window); gtk_main(); return 0; } |
У нашому вищенаведеному прикладі ми створили просту кнопку-прапорець, заголовок до якої буде відображатись, або ж буде відсутнім, залежно від того, буде встановлено прапорець, чи ні.
Створюємо віджет GtkCheckButton, зі станок за замовчуванням “прапорець поставлено”:
1 2 | check = gtk_check_button_new_with_label("Show title"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); |
Тут ми прибираємо з нашої кнопки-прапорця фокус:
1 | GTK_WIDGET_UNSET_FLAGS(check, GTK_CAN_FOCUS); |
А цей код змінюєватиме заголовок кнопки в залежності від стану папорця:
1 2 3 4 5 | if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { gtk_window_set_title(window, "GtkCheckButton"); } else { gtk_window_set_title(window, ""); } |

GtkComboBox
GtkComboBox — віджет, який дозволяє користувачеві обирати одну опцію з переліку.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <gtk/gtk.h> void combo_selected(GtkWidget *widget, gpointer window) { gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget)); gtk_label_set_text(GTK_LABEL(window), text); g_free(text); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *fixed; GtkWidget *combo; GtkWidget *label; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GtkCombo"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); fixed = gtk_fixed_new(); combo = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Ubuntu"); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Debian"); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Fedora"); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Slackware"); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Gentoo"); gtk_fixed_put(GTK_FIXED(fixed), combo, 50, 50); gtk_container_add(GTK_CONTAINER(window), fixed); label = gtk_label_new("-"); gtk_fixed_put(GTK_FIXED(fixed), label, 50, 110); g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window)); g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(combo_selected), (gpointer) label); gtk_widget_show_all(window); gtk_main(); return 0; } |
У вищенаведеному прикладі ми створили комбінований список і текстову мітку. Комбінований список має п’ять опцій. Це назви дистрибутивів лінукс. Тексова мітка показуватиме нам поточний обраний з переліку дистрибутив:
1 2 3 4 5 6 | combo = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Ubuntu"); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Mandriva"); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Fedora"); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Gentoo"); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Debian"); |
Створюємо GtkComboBox з переліком дистрибутиівів лінукс:
1 | label = gtk_label_new("-"); |
Також створюємо текствову мітку, заголовком якої буде поточний обраний дистрибутив у GtkComboBox:
1 2 3 | gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget)); gtk_label_set_text(GTK_LABEL(window), text); g_free(text); |
А цей код мінятиме заголовок текстової мітки у залежності від обраного дистрибутиву:
1 2 3 4 | gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget)); gtk_label_set_text(GTK_LABEL(window), text); g_free(text); |

