2017-03-08 156 views
1

此代碼創建一個帶有標籤的窗口的程序,如果您單擊標籤,程序將執行一個作爲參數g_signal_connect(G_OBJECT(eventbox), "button_press_event", G_CALLBACK(on_event_clicked), buffer)的參數傳遞的fprintf緩衝區。以前程序在緩衝區中輸入這個字符串「Hello Word」,然後程序應該打印這條消息,但也許程序只打印出亂碼字符。我錯在哪裏?GTK - 如何將參數傳遞給GtkEventBox

#include <gtk/gtk.h> 
#include <stdlib.h> 
#include <string.h> 
void on_event_clicked (GtkWidget* widget, gpointer user_data); 

int main (int argc, char **argv) { 
    GtkWidget *window; 
    GtkWidget *eventbox; 
    GtkWidget *label; 
    char*  buffer = malloc(sizeof(char)*10); 

    strcpy(buffer, "Hello Word\0"); 

    gtk_init (&argc,&argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    label = gtk_label_new ("Hello Word"); 
    eventbox = gtk_event_box_new(); 

    gtk_container_add (GTK_CONTAINER(eventbox), label); 
    gtk_container_add (GTK_CONTAINER(window), eventbox); 
    gtk_widget_show_all (window); 

    g_signal_connect(G_OBJECT(window), "destroy", 
        G_CALLBACK(gtk_main_quit), NULL); 

    g_signal_connect(G_OBJECT(eventbox), "button_press_event", 
        G_CALLBACK(on_event_clicked), buffer); 

    gtk_main(); 

    return 0; 
} 

void on_event_clicked (GtkWidget *widget, gpointer user_data) { 
    char* pn = user_data; 
    fprintf(stderr, "%s\n", pn); 
} 

回答

2

您的原型爲on_event_clicked()是錯誤的,它不符合GTK +所期望的。

它應該是:

gboolean user_function (GtkWidget *widget, GdkEvent *event, gpointer user_data); 

您需要缺少的參數添加到您的功能,同時還應對一個返回值的要求。請認真記住read the signal documentation

+0

你說得對:') –

+0

愚蠢的錯誤。謝謝 –