Absturz bei closeAllWindows

Alles rund um die Programmierung mit Qt
Antworten
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

Absturz bei closeAllWindows

Beitrag 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;
        }
    }
}
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

in MainWindow::closeEvent ( QCloseEvent * event )
musst du einfach PhaseObjects.resize(0) aufrufen. Das war's.
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

Beitrag 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.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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.
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

Beitrag 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]
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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...
Antworten