gtkmm - Fenster verstecken ohne die Applikation zu beenden



  • Google und Forumsuche haben merkwüdrigerweise nichts ergeben. Bei so einem Thema hätte ich das schon erwartet, aber vielleicht hab ich ja auch falsch gesucht. Mein Problem ist recht schnell erklärt: ich habe ein Login-Fenster. Nachdem der Benutzer in einem Textfeld auf Enter gedrückt hat, soll sich das Login-Fenster schließen und das Hauptfenster öffnen. Das Login-Fenster hab ich in der Gtk::Main::run() angegeben, was wohl auch das Problem ist, da die Hauptschleife unterbrochen wird, sobald das Hauptfenster geschlossen wird. Code:

    int main(int argc, char **argv)
    {
        Gtk::Main oMain(argc, argv);
    
        main_window oMainWindow;
        login_window oLoginWindow(&oMainWindow);
    
        oMain.run(oLoginWindow);
    
        return 0;
    }
    

    Wie gesagt hab ich nun im login_window ein Textfeld. Bei Druck auf Enter darin wird diese Funktion aufgerufen:

    void login_window::txtLogin_activate()
    {
        this->hide();
        this->pNextWindow->show();
    }
    

    this->pNextWindow ist einfach ein Pointer auf das nächste Fenster (wird in der main() an den Konstruktor übergeben). Wie löse ich das Problemchen am besten?



  • Ich weiss zwar nicht, ob das so am besten ist, aber so funktionierts es:

    #include <gtkmm.h>
    
    struct MainWindow : Gtk::Window {
      MainWindow() { set_title("Main Window"); }
      virtual bool on_delete_event(GdkEventAny *event) { Gtk::Main::quit(); }
    };
    struct LoginWindow : Gtk::Window {
      LoginWindow(MainWindow *mw) : mw(mw) { set_title("Login Window"); }
      virtual bool on_delete_event(GdkEventAny *event) { mw->show(); hide(); }
      MainWindow *mw;
    };
    int main(int argc, char **argv)
    {
      Gtk::Main main (argc, argv);
      MainWindow mw;
      LoginWindow lw(&mw);
      lw.show();
      main.run();
      return 0;
    }
    

    Eventuell reicht bei dir auch schon

    oMain.run(oLoginWindow);
    

    durch

    oLoginWindow.show();
    oMain.run();
    

    zu ersetzen.



  • Danke! Die Lösung reicht mir 🙂


Anmelden zum Antworten