ввод текста
виджет
ввода позволяет вводить текст и отображать
его в специальном текстовом окне. текст
может быть установлен вызовом функции
позволяющей заменять предустановленный
текст на новый, или может использоваться
текущий текстовый ввод.
функция для создания
виджетов ввода текста:
gtkwidget *gtk_entry_new( void );
|
следующая функция
меняет текст, находящийся в данный
момент в виджете ввода:
void gtk_entry_set_text( gtkentry *entry,
const gchar *text );
|
функция gtk_entry_set_text()
устанавливает новое содержимое виджета
ввода, перезаписывая текущее содержимое.
заметьте, класс ввода содержит editable
interface (да, gobject поддерживают джава-подобный
интерфейс (java-like interfaces)) который содержит
много функций для манипуляций содержимым.
содержимое
ввода может быть восстановлено при
помощи следующей функции. это полезно
для функций обратного вызова описанных
ниже.
const gchar *gtk_entry_get_text( gtkentry *entry );
|
значение возвращенное
этой функцией применяется для внутреннего
использования и не должно высвобождаться
с помощью использования free() или g_free().
если
мы не хотим чтобы что-либо изменяло
содержимое ввода, то мы можем изменить
статус редактирования:
void gtk_editable_set_editable( gtkeditable *entry,
gboolean editable );
|
эта функция позволяет
переключать состояние редактирования
для виджета ввода, устанавливая в
качестве аргумента editable
значение true или false.
если
вы не хотите чтобы в момент ввода текста
он отображался в виджете ввода, например
при вводе пароля, то вы можете
воспользоваться следующей функцией
установив соответствующий флаг.
void gtk_entry_set_visibility( gtkentry *entry,
gboolean visible );
|
установки
области текста могут быть определены
следующей функцией. это чаще всего
используется для установки текста по
умолчанию, который удаляется после
ввода пользователя.
void gtk_editable_select_region( gtkeditable *entry,
gint start,
gint end );
|
если
нужно перехватить момент, когда
пользователь производит ввод, можно
подключить сигнал activate или
changed. сигнал activate производится,
когда пользователь нажал клавишу в
области виджета ввода. сигнал changed
производится, когда происходит любое
изменение текста вообще, например когда
вводится или удаляется символ.
ниже
приведен пример кода, для создания
виджета ввода текста.
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
void enter_callback( gtkwidget *widget,
gtkwidget *entry )
{
const gchar *entry_text;
entry_text = gtk_entry_get_text (gtk_entry (entry));
printf("entry contents: %s\n", entry_text);
}
void entry_toggle_editable( gtkwidget *checkbutton,
gtkwidget *entry )
{
gtk_editable_set_editable (gtk_editable (entry),
gtk_toggle_button (checkbutton)->active);
}
void entry_toggle_visibility( gtkwidget *checkbutton,
gtkwidget *entry )
{
gtk_entry_set_visibility (gtk_entry (entry),
gtk_toggle_button (checkbutton)->active);
}
int main( int argc,
char *argv[] )
{
gtkwidget *window;
gtkwidget *vbox, *hbox;
gtkwidget *entry;
gtkwidget *button;
gtkwidget *check;
gint tmp_pos;
gtk_init (&argc, &argv);
/* создаём новое окно */
window = gtk_window_new (gtk_window_toplevel);
gtk_widget_set_size_request (gtk_widget (window), 200, 100);
gtk_window_set_title (gtk_window (window), "gtk entry");
g_signal_connect (g_object (window), "destroy",
g_callback (gtk_main_quit), null);
g_signal_connect_swapped (g_object (window), "delete_event",
g_callback (gtk_widget_destroy),
g_object (window));
vbox = gtk_vbox_new (false, 0);
gtk_container_add (gtk_container (window), vbox);
gtk_widget_show (vbox);
entry = gtk_entry_new ();
gtk_entry_set_max_length (gtk_entry (entry), 50);
g_signal_connect (g_object (entry), "activate",
g_callback (enter_callback),
(gpointer) entry);
gtk_entry_set_text (gtk_entry (entry), "hello");
tmp_pos = gtk_entry (entry)->text_length;
gtk_editable_insert_text (gtk_editable (entry), " world", -1, &tmp_pos);
gtk_editable_select_region (gtk_editable (entry),
0, gtk_entry (entry)->text_length);
gtk_box_pack_start (gtk_box (vbox), entry, true, true, 0);
gtk_widget_show (entry);
hbox = gtk_hbox_new (false, 0);
gtk_container_add (gtk_container (vbox), hbox);
gtk_widget_show (hbox);
check = gtk_check_button_new_with_label ("editable");
gtk_box_pack_start (gtk_box (hbox), check, true, true, 0);
g_signal_connect (g_object (check), "toggled",
g_callback (entry_toggle_editable), (gpointer) entry);
gtk_toggle_button_set_active (gtk_toggle_button (check), true);
gtk_widget_show (check);
check = gtk_check_button_new_with_label ("visible");
gtk_box_pack_start (gtk_box (hbox), check, true, true, 0);
g_signal_connect (g_object (check), "toggled",
g_callback (entry_toggle_visibility), (gpointer) entry);
gtk_toggle_button_set_active (gtk_toggle_button (check), true);
gtk_widget_show (check);
button = gtk_button_new_from_stock (gtk_stock_close);
g_signal_connect_swapped (g_object (button), "clicked",
g_callback (gtk_widget_destroy),
g_object (window));
gtk_box_pack_start (gtk_box (vbox), button, true, true, 0);
gtk_widget_set_flags (button, gtk_can_default);
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main();
return 0;
}
|
|