2011-01-31 104 views
2

這裏對GTK +回調是我的代碼:傳遞參數/參數信號在C

#include <gtk/gtk.h> 

G_MODULE_EXPORT void waka(GtkWidget *button, GtkWidget* entry1) 
{ 
printf("%s",gtk_entry_get_text(GTK_ENTRY(entry1))); 
} 

int main(int argc, char * argv[]) 
{ 

GtkWidget *window, *button, *entry; 

gtk_init(&argc,&argv); 

window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

button = gtk_button_new_with_label("hha"); 
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(waka),entry); 

entry = gtk_entry_new(); 

GtkWidget *vbox; 

vbox = gtk_vbox_new(FALSE,2); 

gtk_box_pack_start_defaults(GTK_BOX(vbox),button); 
gtk_box_pack_start_defaults(GTK_BOX(vbox),entry); 

gtk_container_add(GTK_CONTAINER(window),vbox); 


gtk_widget_show_all(window); 
gtk_main(); 


return 0; 
} 

當我啓動它,並儘量填寫在輸入框中一些字符串,然後按一下按鈕,它說'分段錯誤'。到底是怎麼回事?

此外,回調僅適用於一個用戶數據參數。如果我想要兩個或更多參數,必須在回調函數中執行什麼以及在致電g_signal_connect()

回答

4

問題是,您正在嘗試使用指針條目之前初始化它。我改了一下你的代碼來解決這個問題,看它是否會爲你工作:

#include <gtk/gtk.h> 

void waka(GtkWidget *button, GtkWidget* entry1) 
{ 
g_print("entry: %s\n", gtk_entry_get_text(GTK_ENTRY(entry1))); 
} 

int main(int argc, char * argv[]) 
{ 
GtkWidget *window, *button, *entry, *vbox; 

gtk_init(&argc, &argv); 

window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
button = gtk_button_new_with_label("hha"); 
entry = gtk_entry_new(); 
vbox = gtk_vbox_new(FALSE, 2); 

gtk_box_pack_start_defaults(GTK_BOX(vbox),button); 
gtk_box_pack_start_defaults(GTK_BOX(vbox),entry); 

gtk_container_add(GTK_CONTAINER(window),vbox); 

g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(waka), entry); 

gtk_widget_show_all(window); 
gtk_main(); 

return 0; 
} 

希望這會有所幫助,至於

+0

THX的傢伙,反正如何通過兩個部件回調,做我需要usingg結構?或者我需要全局聲明這個小部件(例如static var/out of function var)? – capede 2011-02-01 09:40:07