PATCH [ was: Re: Showstopper with Qt 3.1.2? ]

Matthias Ettrich ettrich at
Wed Mar 5 13:53:17 GMT 2003

On Wednesday 05 March 2003 00:28, Stephan Binner wrote:
> Hello,
> please try this with Qt 3.1.2: Start Konsole or KEdit and call "Edit/Find
> [in History]...", don't enter anything but "Close" and call "Find" again.
> Here the second time the dialog hides immediately (and as a side-effect
> selection in Konsole will not work anymore and Konsole crashes at exit)
> caused by endless repeated calling of KDialogBase::slotClose(). :-(
> I suppose something is broken deep within Qt 3.1.2.

This is a tough one. We received many reports about QWidget::close() in 3.1 no 
longer sending a close event to hidden widgets, so we had to do something 
about this. In addition, users were asking to receive close events (and gain 
close handling, like the QApplication::lastWindowClosed() signal, etc.) when 
calling QDialog::accept()/reject() which both call QDialog::done().

Now, KDialogbase in closeEvent() invokes a timer (through 
QButton::animateClick() ), which calls QDialog::reject(), which calls close() 
which sends a close event, and so on.

For the time being we do not see a fix for all issues, and we haven't seen 
problems other than KDialogBase yet. A possibility is to make 
QButton::animateClick() work for shown buttons only, but this is likely to 
break even more code.

Here's a simple fix to KDialogBase:

Index: kdialogbase.cpp
RCS file: /home/kde/kdelibs/kdeui/kdialogbase.cpp,v
retrieving revision 1.78
diff -d -u -r1.78 kdialogbase.cpp
--- kdialogbase.cpp     30 Jan 2003 18:55:35 -0000      1.78
+++ kdialogbase.cpp     5 Mar 2003 13:56:21 -0000
@@ -1546,7 +1546,7 @@
 void KDialogBase::closeEvent( QCloseEvent *e )
     QPushButton *pb = actionButton( mEscapeButton );
-    if( pb != 0 ) {
+    if( pb != 0 && isShown() ) {
     } else {
        QDialog::closeEvent( e );


More information about the kde-core-devel mailing list