GTK+ 2.0 Tutorial

<<< Previous

Miscellaneous Widgets

Next >>>


Комбинированный виджет ввода

Комбинированный ввод - ещё один довольно простой виджет, который реально является комбинацией двух других виджетов. Для пользователя этот виджет выглядит как поле для ввода текста и выпадающее меню содержащее возможные варианты ввода. Альтернативно, пользователь может вводить в список выбора дополнительные варианты.

В следующей структуре представлены компоненты комбинированного ввода:

struct _GtkCombo { GtkHBox hbox; GtkWidget *entry; GtkWidget *button; GtkWidget *popup; GtkWidget *popwin; GtkWidget *list; ... };

Комбинированный ввод имеет две основные части: entry и list.

Создаём комбинированный ввод:

GtkWidget *gtk_combo_new( void );

Теперь, при непосредственном манипулировании entry, создаём список доступных значений для ввода, выпадающий из строки ввода:

gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), "My String.");

Задаём значение для каждой строки выпадающего списка:

void gtk_combo_set_popdown_strings( GtkCombo *combo, GList *strings );

Прежде всего вы должны собрать строки в GList. GList - связанное выполнение списка, входит в состав GLib и поддерживается библиотекой GTK. При беглом рассмотрении это выглядит так, вы создаёте указатель на GList равный NULL, затем прикладываете перечень:

GList *g_list_append( GList *glist, gpointer data );

Важно инициализировать указатель GList равным NULL. Значение возвращённое из функции g_list_append() должно использоваться как новый указатель на GList.

Пример создания списка вариантов:

GList *glist = NULL; glist = g_list_append (glist, "String 1"); glist = g_list_append (glist, "String 2"); glist = g_list_append (glist, "String 3"); glist = g_list_append (glist, "String 4"); gtk_combo_set_popdown_strings (GTK_COMBO (combo), glist); /* glist освобождается, combo забирает копии */

Виджет combo создаёт копии строк переданных в структуру glist. Как результат, вы можете освободить память занимаемую списком если ваше приложение нуждается в этом.

В этом пункте рассматривается работающий комбинированный ввод. Есть несколько аспектов которые вы можете изменять. Это делается функциями:

void gtk_combo_set_use_arrows( GtkCombo *combo, gboolean val ); void gtk_combo_set_use_arrows_always( GtkCombo *combo, gboolean val ); void gtk_combo_set_case_sensitive( GtkCombo *combo, gboolean val );

gtk_combo_set_use_arrows() позволяет пользователю изменять значение ввода используя клавиши стрелки up/down. Сам список не поднимается, а скорее заменяет текущее значение ввода на следующее по списку (вверх или вниз, как указывает выбор вашей клавиши). Обычно в окне ввода клавиши стрелки используются для смещения фокуса (вы можете также использовать TAB). Заметьте, что при достижении последнего значения в списке и нажатии кнопки вниз происходит перемещение фокуса на самый верх для последующего продвижения, тоже самое происходит и в обратном направлении.

Если текущее значение во входе не находится в списке, то функция gtk_combo_set_use_arrows() - отключена.

gtk_combo_set_use_arrows_always() - также позволяет циклически проходить по списку выбора вверх или вниз используя клавиши стрелки, за исключением того, что полностью отключает использование клавиш  up и down для смещения фокуса.

gtk_combo_set_case_sensitive() - переключает GTK на поиск чувствительный или нет к регистру. Это используется когда нужно найти текущее значение строки ввода в списке значений.  Окончание может быть выполнено или чувствительным к регистру или нечувствительным способом, в зависимости от использования этой функции. Combo widget может просто прекратить текущий ввод используя комбинацию клавиш MOD-1 и "Tab". MOD-1 тоже самое что и клавиша "Alt".  Отметьте однако, что некоторые оконные менеджеры, также используют эту ключевую комбинацию, которая отменит ее использование в пределах GTK.

Теперь, когда мы имеем поле со списком, приспособленное для просмотра и действий, как мы этого хотим, все, что остается, это получить данные для поля со списком. В большинстве случаев, всё что вам нужно для получения данных - это ввод.  К вводу обращаются просто GTK_ENTRY (GTK_COMBO (combo)->entry). Два основных действия, которые вы захотите выполнять - соединяются с активизирующимся сигналом, который указывает, что пользователь нажал Return или ENTER клавишу и прочёл текст.

Первое делается так:

g_signal_connect (G_OBJECT (GTK_COMBO (combo)->entry), "activate", G_CALLBACK (my_callback_function), (gpointer) my_data);

Получение текста в любое произвольное время достигается, просто функцией ввода:

gchar *gtk_entry_get_text( GtkEntry *entry );

Как нибудь так:

gchar *string; string = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (combo)->entry));

Есть ещё функция:

void gtk_combo_disable_activate( GtkCombo *combo );

она отключает сигнал активизации в поле ввода в виджете комбинированного ввода, непонятно при каких обстоятельствах это может пригодится, но тем не менее эта функция существует.


<<< Previous

Home

Next >>>

Spin Buttons

Up

Calendar