Passing additional arguments to gtk function

后端 未结 3 1259
夕颜
夕颜 2020-12-18 11:46

I\'m trying to learn how to make GUIs using gtk+ 3.0. I want to pass a simple argument, an integer, to a callback function, so that when I press the button the value of the

相关标签:
3条回答
  • 2020-12-18 12:36
    int a = 42;
    `gpointer ptr = GINT_TO_POINTER (a)`
    //GUINT_TO_POINTER (a), GBOOLEAN_TO_POINTER (a), GSIZE_TO_POINTER (a)
    reverse:
    
    int a2 = GPOINTER_TO_INT (ptr);
    //GPOINTER_TO_UINT (ptr), GPOINTER_TO_...
    
    The above works perfectly fine to pass integer data thru g_signal_connect. Used as follows.
    
    GtkWidget *Parison_ON_Buttons[10];
    
    for (i=0; i < 8; i++)
    {
        gpointer ONptr = GINT_TO_POINTER (i);
        g_signal_connect(GTK_SPIN_BUTTON(Parison_ON_Buttons[i]), "activate", G_CALLBACK 
        (Get_Parison_ON_Values),ONptr);
    }
    
    static gboolean Get_Parison_ON_Values (GtkSpinButton *button, gpointer data)
    {
     int ONButtonNUmPressed = GPOINTER_TO_INT (data);
    ....
    }
    
    0 讨论(0)
  • 2020-12-18 12:40

    There are a bunch of useful macros which store an integer (32bit, no longer!) into a pointer.

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

    reverse:

    int a2 = GPOINTER_TO_INT (ptr);
    //GPOINTER_TO_UINT (ptr), GPOINTER_TO_...
    
    0 讨论(0)
  • 2020-12-18 12:41

    To pass multiple arguments, you define a structure, fill it, and pass a pointer to the structure as the gpointer user_data parameter of the g_signal_connect, which is the last parameter. Then in your callback, you just cast the user_data parameter to a pointer to your structure.

    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;
    }
    

    You MUST use the signature of the callback defined in the documentation (look at the "signals" section of the documentation for GtkButton), you can't make things up. BTW, you can't pass n as a reference instead of a pointer. If you want to use GTK in C++, give a look at GTKmm.

    0 讨论(0)
提交回复
热议问题