Gtkmm mehrere Fenster



  • Hallo Community,
    Ich benutze gtkmm und möchte außer dem Hauptfenster(welches ich durch Gtk::Main::run(fenster); aufrufe) noch ein weiteres Fenster anzeigen lassen.
    Also:
    GTK::WINDOW m_window;

    Gtk::Main::run(m_window); funktioniert

    Ich hoffe ihr versteht was mein Problem ist und könnt mir weiterhelfen



  • Ich meinte Gtk::Main::run(m_window); funktioniert nicht



  • Das sollte man auch nur ein mal aufrufen.

    Leite einfach von der Gtk::Window Klasse dein zweites Fenster ab und rufe dann im Ctor der ersten Klasse die show() Methode der zweiten Klasse auf.



  • Irgendwie funktioniert das bei mir nicht. Kannst du vlt ein kleines Beispiel machen?

    Wäre dir sehr dankbar

    mfg wandschrank



  • Was genau funktioniert nicht, und mit welchem Code hast du es probiert?
    (Ausschnitte)



  • Ich habe mal ein vereinfachtes Beispiel gemacht, hoffe es sind keine Fehler darin:

    class Klasse2 : public Gtk::Window
    {
    Klasse2()
    {
      set_default_size(500, 500);
    }
    
    };
    
    class Klasse1 : public Gtk::Window
    {
    public:
    Klasse1()
    {
    set_default_size(500, 500);
    }
    
    private:
    void startfenster2()  //Wird später irgendwann ausgeführt
    {
    Klasse2 window2(); 
    window2.show(); //Geht auch nicht; Was muss ich jetzt hier schreiben das es funktioniert?
    //Gtk::Main::run(window2); <=geht nicht
    }
    };
    
    int main (int argc, char *argv[])
    {
      Gtk::Main kit(argc, argv); //Startet Gtk Main
      Klasse1 window1;
      Gtk::Main::run(window1); //startet Fenster
    }
    


  • class Klasse2 : public Gtk::Window 
    { 
    public:
    Klasse2() 
    { 
      set_default_size(500, 500); 
    } 
    
    }; 
    
    class Klasse1 : public Gtk::Window 
    { 
    public: 
    Klasse1() 
    { 
    set_default_size(500, 500); 
    } 
    
    private: 
    void startfenster2()  //Wird später irgendwann ausgeführt 
    { 
    Klasse2 window2; 
    window2.show(); //Geht auch nicht; Was muss ich jetzt hier schreiben das es funktioniert? 
    //Gtk::Main::run(window2); <=geht nicht 
    } 
    }; 
    
    int main (int argc, char *argv[]) 
    { 
      Gtk::Main kit(argc, argv); //Startet Gtk Main 
      Klasse1 window1; 
      Gtk::Main::run(window1); //startet Fenster 
    }
    

    Wenn ich es so mache kommt der error:
    Klasse1.cpp:(.text+0x2cc): undefined reference to `Klasse1::Klasse1()'



  • Weiß niemand wie das funktioniert, was der error bedeutet oder was ich falsch gemacht habe?

    Ich bekomms einfach nicht hin 😞



  • wandschrank schrieb:

    class Klasse2 : public Gtk::Window
    {
    Klasse2()
    {
      set_default_size(500, 500);
    }
    
    };
    
    class Klasse1 : public Gtk::Window
    {
    public:
    Klasse1()
    {
    set_default_size(500, 500);
    }
    
    private:
    void startfenster2()  //Wird später irgendwann ausgeführt
    {
    Klasse2 window2(); 
    window2.show(); //Geht auch nicht; Was muss ich jetzt hier schreiben das es funktioniert?
    //Gtk::Main::run(window2); <=geht nicht
    }
    };
    
    int main (int argc, char *argv[])
    {
      Gtk::Main kit(argc, argv); //Startet Gtk Main
      Klasse1 window1;
      Gtk::Main::run(window1); //startet Fenster
    }
    

    Wenn du es so machst, wird window2 temporär angelegt, gezeigt, und gleich wieder zerstört, weil der Scope verlassen wird.

    Mach window2 zur Membervariable, dann sollte alles gehen.

    #include <gtkmm.h>
    
    class Klasse2 : public Gtk::Window 
    { 
    	public:
    		Klasse2() 
    		{ 
    		    set_default_size(500, 500); 
    		} 
    }; 
    
    class Klasse1 : public Gtk::Window 
    { 
    	public: 
    		Klasse1() 
    		{ 
    			startfenster2();
    			set_default_size(500, 500); 
    			this->show_all();
    		} 
    
    	private: 
    		Klasse2 window2; 
    		void startfenster2()  //Wird später irgendwann ausgeführt 
    		{ 
    			window2.show_all(); 
    		} 
    }; 
    
    int main (int argc, char *argv[]) 
    { 
    	Gtk::Main kit(argc, argv); //Startet Gtk Main 
    	Klasse1 window1; 
    	Gtk::Main::run(window1); //startet Fenster 
    }
    


  • Danke. Funktioniert super!!

    Aber ich habe die Klasse2 in einer header-datei.
    Also ist der Konstruktor so:
    Klasse1::Klasse1()
    {
    set_default_size(500, 500);
    }

    Nun kommt aber bei Klasse2 window2; der Error:
    Klasse1.cpp:(.text+0x2cc): undefined reference to `Klasse2::Klasse2()'



  • Der Linker kann den default-konstructor von Klasse2 nicht finden...



  • Na klar!

    Ich trottel

    Ich muss das ja mitkompilieren!

    Nochmals danke


Anmelden zum Antworten