[auf unix]problem mit aufrufen von methoden durch GTK_SIGNAL_FUNC



  • also gleich vorweg bin nihct besonders erfahren und ist mein erster versuch mit einer GUI zu programmieren:

    so jetzt wollte ich mir eine klasse zusammenbauen mit einigen ausgaben
    die grundtechnken habe ich von http://pronix.linuxdelta.de/C/gtk:

    so nun zu miner frage wie kann ich über GTK signale methoden meiner klaasse anstatt funktionen aufrufen?

    der folgende code wird mit der fehlermeldung

    $ g++ fenster.c `gtk-config --cflags --libs` -o fenster
    fenster.c: In member function 'void program::generate()':
    fenster.c:47: error: invalid use of member (did you forget the '&' ?)
    

    nicht kompiliert

    ich komm trotz über einer studen googlelei grade einfach nihct weiter und wäre sehr dankbar für einen tipp/idee

    #include <gtk/gtk.h>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class program
    {
    	private:
    		string filePath;
    		void ende_cb(GtkObject *object)
    		{
    			gtk_main_quit();
    		}
    
    	public:
    
    		void generate()
    		{
    			GtkWidget *box;
    			GtkWidget *fenster;
    			GtkWidget *button_quit, *button, *button2;
    			GtkWidget *entry;
    
    			//initialisize gtk
    			gtk_init(NULL, NULL);
    
    			//set window type
    			fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
    			//define buttons
    			button_quit  = gtk_button_new_with_label("Ende");
    			button       = gtk_button_new_with_label("Text löschen");
    			button2      = gtk_button_new_with_label("Text einlesen");
    
    			entry        = gtk_entry_new_with_max_length(50);
    			gtk_entry_set_text(GTK_ENTRY(entry), "Dateipfad");
    
    			// create box
    			box = gtk_vbox_new(FALSE,0);
    
    			//get signals
    			/*Signale registrieren*/
    			gtk_signal_connect(GTK_OBJECT(fenster), "destroy",
    			                    GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
    			gtk_signal_connect(GTK_OBJECT(button_quit), "clicked",
    								GTK_SIGNAL_FUNC(ende_cb),NULL);
    
    			gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);
    
    			gtk_container_set_border_width(GTK_CONTAINER(fenster),25);
    
    			gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 10);
    			gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
    			gtk_box_pack_start(GTK_BOX(box), button2, FALSE, FALSE, 0);
    			gtk_box_pack_start(GTK_BOX(box), button_quit, FALSE, FALSE, 0);
    
    			gtk_container_add(GTK_CONTAINER(fenster),box);
    
    			/*Zeigs uns.....*/
    			gtk_widget_show_all(fenster);
    
    			gtk_main();
    
    		}
    };
    
    int main()
    {
    	program test;
    	test.generate();
    	return 0;
    }
    


  • Hi,
    vielleicht ist dies die Lösung:

    http://pronix.linuxdelta.de/C/gtk/gtk_C_Kurs_kapitel3.shtml#3_1

    gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
                              GTK_SIGNAL_FUNC(my_callback), GTK_OBJECT(fenster));
    

    Also nicht NULL, sondern GTK_OBJEKT(fenster).

    Bye.



  • hmm hat leider nihct geholfen an der fehlermeldung hat sich nichts geändert...

    das problem ist ja allgemein nur, dass ich nihct weiß wie ich mit dem callback auf eine methode verweisen kann...



  • Dein Problem ist, dass du mit GTK_SIGNAL_FUNC nur auf normale Funktionen bzw. static Funktionen in Klassen zugreifen kannst.
    Um dein Problem zu lösen machst du entweder ende_cb static...

    /*.... */
    
        private:
            string filePath;
            static void ende_cb(GtkObject *object)
            {
                gtk_main_quit();
            }
    
            /*.... */
    
            gtk_signal_connect(GTK_OBJECT(button_quit), "clicked",
                               GTK_SIGNAL_FUNC(program::ende_cb),NULL);
    
            /*.... */
    

    oder du schmeißt ende_cb aus der Klasse raus und definierst es als freistehende Funktion.

    void ende_cb(GtkObject *object) {
        gtk_main_quit();
    }
    
    class program
    {
    
            /*.... */
    
            gtk_signal_connect(GTK_OBJECT(button_quit), "clicked",
                               GTK_SIGNAL_FUNC(ende_cb),NULL);
    
            /*.... */
    

    Im Übrigen gibt es mit gtkmm einen sehr guten C++ Wrapper für GTK+. Da kann man dann auch auf Member-Funktionen zeigen und noch viele andere Dinge 😉

    Cheers

    GPC



  • hmm ok danke das funktioniert ja schonmal super 👍

    aber iwie komm ich mit dem GTK konzept immer noch nihct so wirklich klar ich meine ich kann so ja immernoch keinen button erstellen, der z.B. ungeklickt etwas adneres draufstehn hat als wenn er geklickt wurde oder doch?

    wie wäre soetwas denn zu verwirklichen ich meien das ist ja iwie die basis, damit ich überhaupt mal ein kleiens programm auf die beine gestellt bekomme



  • Dominik1992 schrieb:

    aber iwie komm ich mit dem GTK konzept immer noch nihct so wirklich klar ich meine ich kann so ja immernoch keinen button erstellen, der z.B. ungeklickt etwas adneres draufstehn hat als wenn er geklickt wurde oder doch?

    Doch klar, einfach im Event-Handler (also die Funktion, die mit dem Button verknüpft ist) die entsprechende Text-Eigenschaft des Buttons setzen. Wie man das macht, steht in der Dokumentation von GTK+.
    Du solltest dir allgemein mal das Tutorial reinziehen.. http://library.gnome.org/devel/gtk-tutorial/stable/


Anmelden zum Antworten