В этой статье мы рассмотрим самый популярный виджет GtkEntry — это однострочное поле для ввода текста. Этот виджет применяется для ввода данных от пользователя.
1. Создание виджета GtkEntry
Создадим поле для ввода логина. Для создания виджета нужно сделать три шага:
- Создать указатель на виджет;
- Создать сам виджет;
- Добавить виджет в окно.
GtkWidget *login_entry;
login_entry = gtk_entry_new();
gtk_container_add(GTK_CONTAINER(window), login_entry);
Но так как GtkEntry часто используется в паре с ярлыком, то напишем минимальную программу для ввода логина.
# 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. Поле для ввода пароля
Теперь создадим поле для ввода пароля. Для этого сначала создаем обычное поле ввода, а потом вызываем функцию:
gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);
Теперь программа целиком
# 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. Для этого существуют команды:
void gtk_entry_set_text(GtkEntry *entry,
const gchar *text);const gchar* gtk_entry_get_text (GtkEntry *entry);
Добавим в программу две кнопки. Одна будет добавлять значения в поля ввода, а другая — удалять их.
# 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;
}
Вот результат работы программы:
Можно ли стать программистом за год с нуля?
Читайте в моей бесплатной мини-книге «Путь в программисты». Скачать её можно здесь.