Seite 1 von 1

Absturz bei closeAllWindows

Verfasst: 1. Mai 2008 10:59
von pospiech
Ich möchte, dass das Programm korrekt geschlossen wird bei einem Klicken von X im Fenstertitel. Dazu fange ich closeEvent ab:

Code: Alles auswählen

void MainWindow::closeEvent ( QCloseEvent * event )  
{
	quitProgram();
}
im Beendigungscode kommt das Programm jedoch nie aus closeAllWindows heraus.

Code: Alles auswählen

void MainWindow::quitProgram()
{
	qApp->closeAllWindows();
	PhaseObjects.resize(0);
	qApp->quit();	
}
konkret kommt das Programm nie aus der for Schleife von closeAllWindows() heraus:

Code: Alles auswählen

void QApplication::closeAllWindows()
{
    bool did_close = true;
    QWidget *w;
    while((w = activeModalWidget()) && did_close) {
        if(!w->isVisible())
            break;
        did_close = w->close();
    }
    QWidgetList list = QApplication::topLevelWidgets();
    for (int i = 0; did_close && i < list.size(); ++i) {
        w = list.at(i);
        if (w->isVisible() && w->windowType() != Qt::Desktop) {
            did_close = w->close();
            list = QApplication::topLevelWidgets();
            i = -1;
        }
    }
}

Verfasst: 4. Mai 2008 12:57
von lepsai
in MainWindow::closeEvent ( QCloseEvent * event )
musst du einfach PhaseObjects.resize(0) aufrufen. Das war's.

Verfasst: 4. Mai 2008 15:51
von pospiech
lepsai hat geschrieben:in MainWindow::closeEvent ( QCloseEvent * event )
musst du einfach PhaseObjects.resize(0) aufrufen. Das war's.
Das löst das Problem nicht, und ich wüsste auch nicht was diese Klasse mit dem Problem zu tun hat.

Verfasst: 4. Mai 2008 16:01
von lepsai
Also, closeEvent() ist eine Callback-Funktion, die aufgerufen wird, wenn dein Widget geschloßen wird, was beim Beenden der Anwendung der Fall sein wird. Der Aufruf von quitProgram() in closeEvent() führt deswegen zu einer nicht terminierenden Rekursion.
Mach's, wie ich beschrieben habe, und dein Problem ist gelöst.

Verfasst: 4. Mai 2008 16:15
von pospiech
lepsai hat geschrieben:Also, closeEvent() ist eine Callback-Funktion, die aufgerufen wird, wenn dein Widget geschloßen wird, was beim Beenden der Anwendung der Fall sein wird. Der Aufruf von quitProgram() in closeEvent() führt deswegen zu einer nicht terminierenden Rekursion.
Mach's, wie ich beschrieben habe, und dein Problem ist gelöst.
Achso, das habe ich inzwischen gelöst - ändert aber trotzdem nichts daran das closeAllWindows nie verlassen wird.

Code: Alles auswählen

void MainWindow::closeEvent ( QCloseEvent * event )  
{	
	if (!m_OnQuitApplication)
		quitProgram();
}

void MainWindow::quitProgram()
{
	m_OnQuitApplication = true;
	PhaseObjects.resize(0);
	qApp->closeAllWindows();
	qApp->quit();	
}
[/code]

Verfasst: 4. Mai 2008 16:24
von lepsai
Tut mir leid, aber du hast nicht verstanden, worum es geht. Also nochmal:
Der Aufruf von quit() oder closeAllWindows() in closeEvent() ist tödlich und vor allem überflüssig.

Schreib einfach in closeEvent():
PhaseObjects.resize(0); (oder besser: PhaseObjects.clear())

und in main():
setQuitOnLastWindowClosed (true);

dann gibt es keine Probleme mehr...