首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从GtkEntry获取文本

从GtkEntry获取文本
EN

Stack Overflow用户
提问于 2010-07-12 09:05:38
回答 2查看 9K关注 0票数 1

我在尝试编译以下代码时遇到了分段错误。我的问题是,这是从GtkEntry获取文本的正确方法吗?如果是,为什么会出现分段错误?如果不是,那么从GtkEntry中检索文本的正确方法是什么?

代码语言:javascript
复制
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);
}

已单击信号回调。

代码语言:javascript
复制
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));
}

包含文本条目的结构。

代码语言:javascript
复制
struct textEntries{
GtkWidget *entryDado1;
GtkWidget *entryDado2;
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-12 12:30:26

在这一行中:

代码语言:javascript
复制
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(applyIngresarDados), &dados);

您传递一个指向dados结构的指针,该结构是堆栈分配的:

代码语言:javascript
复制
struct textEntries dados;

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

票数 4
EN

Stack Overflow用户

发布于 2010-07-12 12:22:16

回调签名应该是这样的

代码语言:javascript
复制
gboolean appCallBack(GtkWidget*,gpointer);

你可以将类型转换为你的类型的结构。请使用gtk_entry_new().接口创建条目我在gtk_entry_new_with_max_length的gtk+2.0文档中没有找到任何引用。

代码语言:javascript
复制
GtkWidget *entry;
entry = gtk_entry_new();

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

代码语言:javascript
复制
GtkWidget *entry = (GtkWidget *) callback_data; //data passed in signal connect.

然后,您可以通过调用从该条目中获取文本

代码语言:javascript
复制
gchar *text;
text = gtk_entry_get_text(GTK_ENTRY(entry));

还要进行适当的错误检查。

或者,您可以将文本项结构声明为指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3225302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档