В этой статье мы рассмотрим самый популярный виджет GtkEntry — это однострочное поле для ввода текста. Этот виджет применяется для ввода данных от пользователя.
1. Создание виджета GtkEntry
Создадим поле для ввода логина. Для создания виджета нужно сделать три шага:
- Создать указатель на виджет;
- Создать сам виджет;
- Добавить виджет в окно.
1 2 3 |
GtkWidget *login_entry; login_entry = gtk_entry_new(); gtk_container_add(GTK_CONTAINER(window), login_entry); |
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 |
#include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *login_label; GtkWidget *login_entry; GtkWidget *hbox1; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "GtkEntry"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 300, 150); // Создаем ярлык и поле ввода login_label = gtk_label_new("Введите логин:"); login_entry = gtk_entry_new(); // Добавляем их в горизонтальный контейнер hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_box_pack_start(GTK_BOX(hbox1), login_label, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox1), login_entry, TRUE, FALSE, 5); gtk_container_add(GTK_CONTAINER(window), hbox1); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main (); return 0; } |
2. Поле для ввода пароля
Теперь создадим поле для ввода пароля. Для этого сначала создаем обычное поле ввода, а потом вызываем функцию:
1 |
gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE); |
Теперь программа целиком
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 |
#include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *login_label, *login_entry; GtkWidget *password_label, *password_entry; GtkWidget *hbox1, *hbox2; GtkWidget *vbox; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "GtkEntry"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 300, 100); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); // Создаем ярлык и поле ввода логина login_label = gtk_label_new("Введите логин:"); login_entry = gtk_entry_new(); // Создаем ярлык и поле ввода пароля password_label = gtk_label_new("Введите пароль:"); password_entry = gtk_entry_new(); gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE); hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_box_pack_start(GTK_BOX(hbox1), login_label, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox1), login_entry, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox1, TRUE, FALSE, 5); hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(hbox2), password_label, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox2, TRUE, FALSE, 5); gtk_container_add(GTK_CONTAINER(window), vbox); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main (); return 0; } |
3. Получение значения поля
Теперь научимся получать и менять значение поля GtkEntry. Для этого существуют команды:
1 2 |
void gtk_entry_set_text(GtkEntry *entry, const gchar *text); const gchar* gtk_entry_get_text (GtkEntry *entry); |
Добавим в программу две кнопки. Одна будет добавлять значения в поля ввода, а другая — удалять их.
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
#include <gtk/gtk.h> GtkWidget *login_label, *login_entry; GtkWidget *password_label, *password_entry; void set_button_clicked(GtkWidget *button, gpointer data) { gtk_entry_set_text(GTK_ENTRY((GtkWidget*) login_entry), "GtkEntry"); gtk_entry_set_text(GTK_ENTRY((GtkWidget*) password_entry), "GtkEntry"); } void del_button_clicked(GtkWidget *button, gpointer data) { gtk_entry_set_text(GTK_ENTRY((GtkWidget*) login_entry), ""); gtk_entry_set_text(GTK_ENTRY((GtkWidget*) password_entry), ""); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *hbox1, *hbox2, *hbox3; GtkWidget *vbox; GtkWidget *set_button, *del_button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "GtkEntry"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 300, 100); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); // Создаем ярлык и поле ввода логина login_label = gtk_label_new("Введите логин:"); login_entry = gtk_entry_new(); // Создаем ярлык и поле ввода пароля password_label = gtk_label_new("Введите пароль:"); password_entry = gtk_entry_new(); gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE); // Создаем кнопки set_button = gtk_button_new_with_label("Установить"); del_button = gtk_button_new_with_label("Удалить"); // Задаем функции кнопок g_signal_connect(GTK_BUTTON(set_button), "clicked", G_CALLBACK(set_button_clicked), login_entry); g_signal_connect(GTK_BUTTON(del_button), "clicked", G_CALLBACK(del_button_clicked), password_entry); hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_box_pack_start(GTK_BOX(hbox1), login_label, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox1), login_entry, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox1, TRUE, FALSE, 5); hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(hbox2), password_label, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox2, TRUE, FALSE, 5); hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(hbox3), set_button, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox3), del_button, TRUE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox3, TRUE, FALSE, 5); gtk_container_add(GTK_CONTAINER(window), vbox); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main (); return 0; } |
Вот результат работы программы: