Получить текст из GtkEntry - PullRequest
1 голос
/ 12 июля 2010

Я получаю ошибку сегментации, пытаясь скомпилировать следующий код. Мой вопрос: это правильный способ получить текст из GtkEntry? Если это так, почему я получаю ошибку сегментации? Если это не так, как правильно извлечь текст из GtkEntry?.

void dialogoIngresarDados(GtkWidget *window){
GtkWidget *dialog;
GtkWidget *vbox, *button;
GtkWidget *hBoxDado1, *hBoxDado2, *label1, *label2;
struct textEntries dados;

dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width(GTK_CONTAINER(dialog),5);
gtk_widget_set_size_request(dialog ,200, 100);
gtk_window_set_title(GTK_WINDOW(dialog), "Dados");
gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);

vbox = gtk_vbox_new(FALSE, 0);

label1 = gtk_label_new("Dado1");
label2 = gtk_label_new("Dado2");
button = gtk_button_new_from_stock(GTK_STOCK_APPLY);

dados.entryDado1 = gtk_entry_new_with_max_length(10);
dados.entryDado2 = gtk_entry_new_with_max_length(10);

hBoxDado1 = gtk_hbox_new(TRUE,0);
hBoxDado2 = gtk_hbox_new(TRUE,0);

gtk_box_pack_start_defaults (GTK_BOX (vbox), hBoxDado1);
gtk_box_pack_start_defaults (GTK_BOX (vbox), hBoxDado2);
gtk_box_pack_start_defaults (GTK_BOX (vbox), button);

gtk_box_pack_start_defaults (GTK_BOX (hBoxDado1), label1);
gtk_box_pack_start_defaults (GTK_BOX (hBoxDado1), dados.entryDado1);

gtk_box_pack_start_defaults (GTK_BOX (hBoxDado2), label2);
gtk_box_pack_start_defaults (GTK_BOX (hBoxDado2), dados.entryDado2);

gtk_container_add (GTK_CONTAINER(dialog), vbox);

g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(applyIngresarDados), &dados);
g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all (dialog);
}

Щелкнул сигнал обратного вызова.

void applyIngresarDados(GtkButton *button, struct textEntries *dados){
const gchar *dado1;
const gchar *dado2;

dado1 = gtk_entry_get_text(GTK_ENTRY(dados->entryDado1));
dado2 = gtk_entry_get_text(GTK_ENTRY(dados->entryDado2));
}

Структура, содержащая текстовые записи.

struct textEntries{
GtkWidget *entryDado1;
GtkWidget *entryDado2;
};

Ответы [ 2 ]

4 голосов
/ 12 июля 2010

В этой строке:

g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(applyIngresarDados), &dados);

вы передаете указатель на структуры dados, который выделяется стеком:

struct textEntries dados;

Это неправильно, потому что, когда структура используетсяпри обратном вызове кадр стека, содержащий эту структуру, уничтожается и, вероятно, перезаписывается некоторыми другими данными.Вы пытаетесь получить доступ к данным мусора в обработчике обратного вызова.

1 голос
/ 12 июля 2010

Ваша подпись обратного вызова должна быть такой:

gboolean appCallBack(GtkWidget*,gpointer);

Вы можете вписать gpointer в структуру вашего типа.Пожалуйста, создайте запись, используя API gtk_entry_new(). Я не нашел никаких ссылок в документации gtk + 2.0 для gtk_entry_new_with_max_length.

GtkWidget *entry;
entry = gtk_entry_new();

Теперь в вашем appCallback функция может получить текст записи следующим образом.*

GtkWidget *entry = (GtkWidget *) callback_data; //data passed in signal connect.

Затем вы можете получить текст из этой записи с помощью вызова

gchar *text;
text = gtk_entry_get_text(GTK_ENTRY(entry));

Также выполните правильную проверку ошибок.

Или вы можете объявить структуру textentries какуказатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...