GTK+ 2.0 Tutorial |
||
---|---|---|
Miscellaneous Widgets |
Комбинированный ввод - ещё один довольно простой виджет, который реально является комбинацией двух других виджетов. Для пользователя этот виджет выглядит как поле для ввода текста и выпадающее меню содержащее возможные варианты ввода. Альтернативно, пользователь может вводить в список выбора дополнительные варианты.
В следующей структуре представлены компоненты комбинированного ввода:
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 );
|
она отключает сигнал активизации в поле ввода в виджете комбинированного ввода, непонятно при каких обстоятельствах это может пригодится, но тем не менее эта функция существует.
Spin Buttons |
Calendar |