C 从GtkEntry获取文本

C 从GtkEntry获取文本,c,gtk,C,Gtk,我在编译下面的代码时遇到了一个分段错误。我的问题是,这是从GtkEntry获取文本的正确方法吗?。如果是,为什么我会出现分割错误?。如果不是,那么从GtkEntry检索文本的正确方法是什么 void dialogoIngresarDados(GtkWidget *window){ GtkWidget *dialog; GtkWidget *vbox, *button; GtkWidget *hBoxDado1, *hBoxDado2, *label1, *label2; struct textE

我在编译下面的代码时遇到了一个分段错误。我的问题是,这是从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;
};

您的回调签名应该是这样的

gboolean appCallBack(GtkWidget*,gpointer);
您可以将gpointer类型转换为您的类型结构。 请使用API gtk_entry_new创建条目。我在gtk+2.0文档中没有找到任何关于gtk_条目_最长新_的参考资料

现在,在appCallback中,函数可以获得如下所示的条目文本

GtkWidget *entry = (GtkWidget *) callback_data; //data passed in signal connect.
然后您可以通过调用从该条目中获取文本

gchar *text;
text = gtk_entry_get_text(GTK_ENTRY(entry));
还要进行正确的错误检查


或者,您可以将textentries结构声明为指针。

回调签名应该是这样的

gboolean appCallBack(GtkWidget*,gpointer);
您可以将gpointer类型转换为您的类型结构。 请使用API gtk_entry_new创建条目。我在gtk+2.0文档中没有找到任何关于gtk_条目_最长新_的参考资料

现在,在appCallback中,函数可以获得如下所示的条目文本

GtkWidget *entry = (GtkWidget *) callback_data; //data passed in signal connect.
然后您可以通过调用从该条目中获取文本

gchar *text;
text = gtk_entry_get_text(GTK_ENTRY(entry));
还要进行正确的错误检查

或者,您可以将textentries结构声明为指针。

在此行中:

g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(applyIngresarDados), &dados);
将指针传递给dados结构,该结构由堆栈分配:

struct textEntries dados;
这是错误的,因为在回调中使用该结构时,包含该结构的堆栈帧将被破坏,并且可能被其他数据覆盖。您正在尝试访问回调处理程序中的垃圾数据。

在此行中:

g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(applyIngresarDados), &dados);
将指针传递给dados结构,该结构由堆栈分配:

struct textEntries dados;

这是错误的,因为在回调中使用该结构时,包含该结构的堆栈帧将被破坏,并且可能被其他数据覆盖。您正在尝试访问回调处理程序中的垃圾数据。

是否在调试器中运行了该代码?究竟是哪一行导致了SEGFULT?gtk_entry_get_text函数导致了SEGFULT。您是否在调试器中运行了代码?究竟是哪一行导致了SEGFULT?gtk_entry_get_text函数导致了SEGFULT。存在具有最大长度的gtk_entry_new_,但自从Gtk-2.0以来,它就被弃用了,不应该在新编写的代码中使用。@Dmitry在这种情况下,我认为回调签名和用于保存小部件的指针存在问题。将gpointer更改为另一种类型的指针的方法也很有效。@Dallen-它可以工作,但要保持一致性,您必须遵循图案有时,您可能希望使用同一个回调,通过具有不同用户数据的相同或不同小部件连接不同的信号。我完全同意你的观点,但这次我只是在寻找一个快速的解决方案。信号将不会以其他方式连接。存在具有最大长度的gtk_entry_new_,但自从Gtk-2.0以来,它就被弃用了,不应该在新编写的代码中使用。@Dmitry在这种情况下,我认为回调签名和用于保存小部件的指针存在问题。将gpointer更改为另一种类型的指针的方法也很有效。@Dallen-它可以工作,但要保持一致性,您必须遵循图案有时,您可能希望使用同一个回调,通过具有不同用户数据的相同或不同小部件连接不同的信号。我完全同意你的观点,但这次我只是在寻找一个快速的解决方案。信号不会以其他方式连接。那么正确的连接方式是什么?在这里提到正确的方法是很有价值的。那么正确的方法是什么呢?这里有必要指出正确的方法。