代码之家  ›  专栏  ›  技术社区  ›  Diego Allen Satish Azad

从GTKentry获取文本

gtk c
  •  1
  • Diego Allen Satish Azad  · 技术社区  · 15 年前

    我在尝试编译以下代码时遇到了一个分段错误。我的问题是,这是从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 回复  |  直到 15 年前
        1
  •  4
  •   dmitry_vk    15 年前

    在这一行中:

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

    将指针传递给dados结构,该结构由堆栈分配:

    struct textEntries dados;
    

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

        2
  •  1
  •   Praveen S    15 年前

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

    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结构声明为指针。