Я вижу, что вы уже приняли ответ, но, поскольку у GTK есть элегантный механизм для решения всего этого, я все равно вынужден написать еще один.
gtk_combo_box_new()
использует malloc()
для внутренних целейвыделить указатель, который он возвращает.(Ну, строго говоря, это не так, но давайте не будем путать здесь.) Таким образом, ваш GtkComboBox
будет жив, пока его родительский виджет не будет уничтожен, или он не будет удален из родительского виджета, или пока вы не уничтожите его вручную (с помощьюgtk_widget_destroy()
, а не free()
).Таким образом, виджет живет в фоновом режиме, но проблема в том, что указатель на него доступен там, где он вам нужен.
Обычно вы хотите манипулировать полем со списком в ответ на сигнал, так как большая частьРабота в программе GTK выполняется в обработчиках сигналов.Если это один из собственных сигналов поля со списком, такой как сигнал changed
, то обратный вызов будет такой функцией:
void on_combo_box_changed(GtkComboBox *combo_box, gpointer user_data)
и combo_box
будет указателем на ваше поле со списком.
Если вы хотите манипулировать полем со списком в ответ на сигнал другого виджета, скажем, сигнал кнопки clicked
, то обратный вызов будет такой функцией:
void on_button_clicked(GtkButton *button, gpointer user_data)
Когда выКак видите, здесь нет указателя на поле со списком.Вот где приходит параметр user_data
. Я предполагаю, что вы подключаете свои сигналы в функции, где вы создаете свои виджеты и упаковываете их в главное окно.(Если это не так, вам следует.) В этой функции у вас будут указатели как на кнопку, так и на поле со списком.Подключите ваш сигнал следующим образом ...
g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), combo_box);
..., передав combo_box
в качестве параметра user_data
к g_signal_connect()
.Затем указатель на поле со списком будет передан обратному вызову on_button_clicked()
, замаскированному как параметр user_data
.Затем вы можете получить к нему доступ следующим образом:
void on_button_clicked(GtkButton *button, gpointer user_data)
{
GtkComboBox *combo_box = GTK_COMBO_BOX(user_data);
gint item = gtk_combo_box_get_active(combo_box);
etc.
или, в зависимости от способа работы стека вызовов в C, даже объявив свой обратный вызов следующим образом:
void on_button_clicked(GtkButton *button, GtkComboBox *combo_box)
...хотя в этом случае вы теряете проверочный тип, который дает GTK_COMBO_BOX()
.