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