gtk callback



  • hi, wieso funktioniert die callback funktion nicht - das problem ist, dass die zahl 6 nicht ausgegeben wird sondern irgendeine zufallszahl.

    #include <gtk/gtk.h>
    
    static void exit_event(GtkWidget *widget,
    		       gpointer   data)
    {
      g_print("%d", (gint)data);
    }
    
    int main(int    argc,
    	 char **argv)
    {
      GtkWidget *window = 0;
      GError    *err = 0;
      gint      *zahl;
    
        *zahl = 6;
    
        gtk_init(&argc, &argv);
    
          window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
          gtk_window_set_title(GTK_WINDOW(window), "SIMC - Kontaktliste");
          gtk_window_resize(GTK_WINDOW(window), 245, 380);
          gtk_window_set_icon_from_file(GTK_WINDOW(window), "/home/workstation/bin/mozilla/firefox/icons/mozicon50.xpm", &err);
    
          g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(exit_event), (gpointer)&zahl);
    
          if (err)
            g_print("%d: %s", err->code, err->message);
    
        gtk_widget_show(window);
        gtk_main();
    
      return 0;
    }
    

    mfg blan



  • Die zeile ist auch falsch:

    g_print("%d", (gint)data);
    

    Es muss folgendermaßen aussehen:

    g_print("%d", *(gint*)data);
    


  • da kommt immer 0 raus - hab mal den folgenden code gemacht (funktioniert in nem gtk-beispiel)

    #include <gtk/gtk.h>
    
    static void move_button(GtkWidget *widget,
    		    	GtkWidget *button)
    {
      if (button)
        g_print("gut");
      else
        g_print("omg");
    
      gtk_button_set_label(GTK_BUTTON(button), "bUTTON");
    }
    
    int main(int    argc,
    	 char **argv)
    {
      GtkWidget *window = 0;
      GtkWidget *button = 0;
    
        gtk_init(&argc, &argv);
    
          window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
          gtk_container_set_border_width(GTK_CONTAINER (window), 4);
    
          button = gtk_button_new_with_label("Button");
          gtk_container_add (GTK_CONTAINER(window), button);
    
          g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(move_button), (gpointer)button);
    
          gtk_widget_show(button);
          gtk_widget_show(window);
    
        gtk_main();
    
      return 0;
    }
    

    was ist daran falsch? O_o

    mfg blan



  • Du willst, dass ein Signal aufgerufen wird, wenn das Fenster gelöscht wurde. Wie soll denn dann der Button noch geändert weden???

    g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(move_button), (gpointer)button);
    

    Stattdessen versuch mal das:

    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(move_button), (gpointer)button);
    

    Du solltest auch mal das hier versuchen:

    if (button)
        g_print("gut\n");
      else
        g_print("omg\n");
    


  • servus - also hab jetzt mall herausgefunden, dass ich doch net so schlecht mit pointern umgehn kann 🙂

    kann es sein, dass ich bei dem "delete-event" von window einfach keine daten mitgeben kann, weil es nur da nicht funktioniert?

    mfg blan



  • blan schrieb:

    kann es sein, dass ich bei dem "delete-event" von window einfach keine daten mitgeben kann, weil es nur da nicht funktioniert?

    Nein. Es funktioniert doch. Nur kannst du den Text auf dem Button nicht mehr ändern, weil der Button schon gelöscht wurde.

    Noch mal zu Erinnerung. Ersetzte mal das:

    if (button)
        g_print("gut");
      else
        g_print("omg");
    

    Durch das:

    if (button)
        g_print("gut\n");
      else
        g_print("omg\n");
    


  • so, dass bringter - das "gut" heist ja da da schonma kein 0-pointer is und das andere weil der button scho gelöscht wurde? (weil das fenster bleibt ja da)

    gut
    
    (gtk:2505): GLib-GObject-WARNING **: invalid unclassed pointer in cast to `GtkButton'
    
    (gtk:2505): Gtk-CRITICAL **: gtk_button_set_label: assertion `GTK_IS_BUTTON (button)' failed
    

    mfg blan



  • Du benutzt die Falsche Callbackfunktion für das delete-event. Das muss so aussehen:

    gboolean move_button (GtkWidget *widget,
        GdkEvent  *event,
        gpointer button)
    {
        if (button)
            g_print("gut\n");
        else
            g_print("omg\n");
    
        gtk_button_set_label(GTK_BUTTON(button), "Bye, bye!");
    }
    

    Delete-Event



  • fetto - vielen dank

    mfg blan


Anmelden zum Antworten