2014-03-13 96 views
1

我试图学习如何使用gtk + 3.0来制作GUI。我想将一个简单的参数,一个整数,传递给一个回调函数,这样当我按下按钮时,参数的值就会改变。这里是我的代码:将其他参数传递给gtk函数

#include <gtk/gtk.h> 

void buttonFunction(GtkWidget * widget, gpointer data, int & n){ 
    n = 1; 
} 

int main(int argc, char ** argv){ 
    int n = 0; 
    GtkWidget * window; 
    GtkWidget * button; 

    gtk_init(&argc,&argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    button = gtk_button_new_with_label("Osss"); 

    gtk_container_add(GTK_CONTAINER(window),button); 
    gtk_widget_show_all(window); 

    g_signal_connect(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL); 
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttonFunction), n); 

    gtk_main(); 

    return 0; 
} 

我发现传递参数的唯一途径是作为一个指针:

void buttonFunction(GtkWidget * widget, gpointer * data); 
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttonFunction), &n); 

我如何传递多个参数这种方式寿?

+1

你的callbck参数是错误的:应该是'gpointer data'而不是'gpointer * data'。 'gpointer'已经是一个指针了,它是'void *'的一个typedef。 – liberforce

回答

3

要传递多个参数,你定义一个结构,填充它,和一个指针传递给上述结构的gpointer user_data参数g_signal_connect的,这是最后一个参数。然后在回调中,您只需将user_data参数投射到指向您的结构的指针。

int main (int argc, char **argv) 
{ 
    int n = 0; 
    GtkWidget *window; 
    GtkWidget *button; 

    gtk_init (&argc,&argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    button = gtk_button_new_with_label ("Osss"); 

    gtk_container_add (GTK_CONTAINER(window), button); 
    gtk_widget_show_all (window); 

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

    /* Here's the magic: you pass a pointer to the variable you'd like to modify 
    * in the callback, be it a simple variable or a struct */ 
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttonFunction), &n); 

    gtk_main(); 

    return 0; 
} 

void on_button_clicked (GtkButton *button, gpointer user_data) /* No extra parameter here ! */ 
{ 
    /* you cast to the type of what you passed as last argument of g_signal_connect */ 
    int *pn = user_data; 
    *pn = 1; 
} 

必须使用该文档中定义回调的签名(寻找的GtkButton文档的“信号”一节),你不能做的事情了。顺便说一句,你不能通过n作为参考,而不是指针。如果您想在C++中使用GTK,请查看GTKmm。

3

有一堆有用的宏将一个整数(32位,不再是!)存储到指针中。

int a = 42; 
gpointer ptr = GINT_TO_POINTER (a) 
//GUINT_TO_POINTER (a), GBOOLEAN_TO_POINTER (a), GSIZE_TO_POINTER (a) 

反向:

int a2 = GPOINTER_TO_INT (ptr); 
//GPOINTER_TO_UINT (ptr), GPOINTER_TO_...