Получить текст из GtkEntry со свойством «text»

#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" )