deleting main windows
Lubos Lunak
l.lunak at sh.cvut.cz
Sat Jul 6 21:05:30 BST 2002
Hello,
I've run into a small problem with QMainWindow derived classes and I'm not
sure who to blame. Simply said, they are not deleled if they're not closed.
If you simply call qApp->quit(), none of currently existing main windows
destructors will be called. The destructors will be only called if the window
is explicitly closed (because of WDestructiveClose).
Since we even have a RESTORE macro for KMainWindow, which dynamically
allocates the instance and forgets the pointer immediately, we're most
probably missing cleanup actions in all applications. In some cases it
apparently doesn't matter, but in mine it does.
In kdebase/konqueror/konq_main.cc, there's at the end of main() this piece of
code :
//// Temporary code, waiting for Qt to do this properly
// Delete all toplevel widgets that have WDestructiveClose, so that we don't
have
// any parts loaded when KLibLoader::cleanUp is called.
QWidgetList *list = QApplication::topLevelWidgets();
QWidgetListIt it(*list);
QWidget * w;
while( (w=it.current()) != 0 ) {
++it;
if ( w->testWFlags( Qt::WDestructiveClose ) )
delete w;
}
(Especially the first comment is interesting - it's there since Dec 2000 :-/.
And depending on where the proper solution belongs, this piece of code may
still be needed for proper cleanup order.)
Ok, so what should be the correct solution? Should all WDestructiveClose
window be deleted in let's say QApplication destructor? Should the app be
responsible for deleting all its toplevel widgets (ugh)? Should all
Q(K)MainWindow class register all its instances and delete them? New widget
flag WDestroyAtAppExit?
--
Lubos Lunak
l.lunak at email.cz ; l.lunak at kde.org
http://dforce.sh.cvut.cz/~seli
More information about the kde-core-devel
mailing list