Seite 1 von 1

[gelöst]mainwindow schliessen -> debugwindow auch schlies

Verfasst: 27. Februar 2011 17:20
von kater
Hallo und sry, ich muss diese Frage nocheinmal stellen. Ich habe ein normales QT GUI Projekt im QtCreator erstellt, also ein MainWindow, und ein DebugWindow was einfach nur Textausgaben enthält. Beendet man nun das Programm mit quit() soll, das Debugwindow auch zu gehn. Tut es aber nicht.

Ich sitzt jetzt schon 2h dran, und die Frage wurde auch schon so oft gestellt.. aber ich finde keine passende Antwort.

Dem Debugwindow kann ich das Mainwindow leider auch nicht als parent mitgebenen, da die beiden sonst ineinander gezeichnet werden. Es also keine 2 getrennten Fenster gibt. Vllt. weis da jemand eine Lösung. Das würde das Problem bestimmt auch lösen.

Ich könnte vllt. noch MainWindow::quit() ueberladen um darin ein delete debugwindow; zu machen. Also die Methode von Hand. Hm...

Hier noch der Code

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    debugwindow(0)
{
    ui->setupUi(this);

    debugwindow = new DebugWindow();
}

class DebugWindow : public QWidget
{
    Q_OBJECT
    // Functions
public:
    explicit DebugWindow(QWidget *parent = 0);
    ~DebugWindow();

private:
private slots:
    void on_pushButton_Save_clicked();


    // Members
public:
private:
    Ui::DebugWindow *ui;

};
Fehlt da irgendwo noch ein connect() mit quit() und close() oder sonstwas? Hab schon so viel probiert, bekomm es nicht hin. Dabei ist das Problem total einfach :/

Verfasst: 27. Februar 2011 17:23
von franzf
MainWindow::closeEvent -> darin ein qApp->quit().

Verfasst: 27. Februar 2011 17:31
von kater
Ich bin höcht erfreut ^^ Großen Dank!

Ich kenn alles. qApp quit() closeEvent() nur in dieser Kombination nicht :)

Verfasst: 28. Februar 2011 11:35
von Herzogswalder
Ich würde es so machen:

Code: Alles auswählen

MainWindow::~MainWindow()
{
        debugwindow->close();
        delete debugwindow;
}
So wird der vom DebugWindow belegte Speicher auch freigegeben, schließlich hat es kein Parent.

Verfasst: 28. Februar 2011 11:55
von franzf
Ich würde einiges anders machen :P
debugwindow nicht als Pointer anlegen.
Wenn für Pointer eh schon die Initialisierungsliste verwendet wird, nicht mit 0 initialisieren, sondern gleich mit nem ordentlichen Wert.

Und wenn die Applikation terminiert, wird sowieso vom Betriebssystem alles sauber gemacht, da entsteht kein Memory-Leak.
Schöner Stil ist es aber nicht. Man sollte sich angewöhnen, alles wieder selber aufzuräumen, nicht dass dann am Ende wichtige Daten nicht mehr gesichert werden, oder sonstige unschöne Nebeneffekte eintreten.

Verfasst: 28. Februar 2011 17:56
von kater
@Herzogswalder geht nicht. Der desconstruktor von MainWindow wird erst aufgerufen, wenn das Debugwindow auch geschlossen ist.

@franzf ganz am Anfang war es auch kein Pointer. Aber wie gesagt, ich hab viel viel viiieell rumprobiert.

Verfasst: 28. Februar 2011 22:10
von Herzogswalder
Dann lässt du eben das

Code: Alles auswählen

debugwindow.close();
weg.

Verfasst: 2. März 2011 10:18
von kater
Ja aber dann ists debugwindow immernoch offen? Ist doch ok jetzt so wie es geht. Besser als ein delete this; in ~debugwindow() ;)