#c #gtk3 #gnome
#c #gtk3 #gnome
Вопрос:
Мне нужно получить текст из множества GtkEntries при нажатии кнопки. Я создаю пользовательскую структуру и передаю ее в обратный вызов кнопки. Я не хочу использовать gtk_entry_get_text(*entry)
, так как мне нужно передать структуру GtkEntries.
typedef struct{
const gchar* id1;
const gchar* id2;
} EntryData;
static void on_click(GtkWidget *widget,
gpointer data) {
EntryData* d= (EntryData*)data;
printf ("Entry contents: %sn", d->id1);
printf ("Entry contents: %sn", d->id2);
}
int main(int argc,char *argv[]) {
// ....
GtkButton *button_create_hp;
GtkEntry *entry_id1;
GtkEntry *entry_id2;
gtk_init(amp;argc, amp;argv);
//...... widget and object initialization
gtk_entry_set_text(entry_ssd,"");
gchar *strval1="sl";
gchar *strval2="sl";
g_object_get(G_OBJECT (entry_id1), "text", amp;strval1,NULL);
g_object_get(G_OBJECT (entry_id2), "text", amp;strval2,NULL);
EntryData entryData={
.id1= strval1,
.id2= strval2
};
g_signal_connect (button_create_hp, "clicked", G_CALLBACK(on_click),amp;entryData);
gtk_main();
return 0;
}
Я также пытался с g_object_get_property (G_OBJECT (entry_id), "text", amp;val);
В обоих случаях измененные значения не печатались при нажатии кнопки. Можете ли вы предложить правильный способ получения значений и передачи их из GtkEntries
Комментарии:
1. Почему
WIData* d=
? Разве это не должно бытьEntryData* d=
?2. Извините, это ошибка. исправлено @KeineLust
3. Этот код кажется мне правильным, загляните глубже в // …… часть инициализации виджета и объекта
4. Ну, в
gchar *strval1="sl";
(повторно объявлено) есть опечатка, но в этом случае она не будет компилироваться.5. Да. Я переименовал некоторую переменную, чтобы прояснить это. В оригинале нет ошибки компиляции или синтаксиса. @KeineLust
Ответ №1:
Это не очень очевидно из документов, но когда вы каким-то образом изменяете текст, он может быть перемещен в другое место, что делает предыдущий указатель недействительным.
Если вы не хотите передавать GtkEntries в свои структуры, вы можете обновлять указатели при EntryBuffer
отправке "deleted-text"
или "inserted-text"
(или подключении к GtkEntry "notify::text"
)