[PyQt] QMessagebox in slot terminates application
Darryl Wallace
darryl.wallace at prosensus.ca
Mon Jan 12 18:16:59 GMT 2009
Hello,
> Although now I'm a little confused as to why the app is even returning
> a value when the MessageBox is closed. Even if you take sys.exit() out
> and just print out the value the app returns, it will still exit.
> Basically the whole app acts like a DialogBox that gets triggered by
> the MessageBox.
You need to start a QApplication because it starts the eventloop for the
GUI application to run in. See the documentation for
QApplication::exec. The program exits with code 0 because the
application exited normally.
>
> I'm not sure I fully understand what all the exec() function does.
I tested this out in the systray example that comes with PyQt. I
connected the maximize action to a method I made called "showMessage"
which then just starts a msg box. If the Systray object is visible on
the screen (via restore) then the QMessageBox does not kill the
program. If the Systray object is hidden it does not kill the program.
The QMessageBox inherits QDialog which has the function exec(): "Shows
the dialog as a modal dialog, blocking until the user closes it. "
Though, my guess is that when exec() is called via the QMessageBox, it
is stealing the event loop from the Systray (or something along those
lines), since its parent (the Systray) is not visible. So when the
messagebox closes it is the end of the application. Furthermore, the
closeEvent for the Systray object is not called when the QMessageBox is
called. This indicates, to me, that the QMessageBox is the end.
I'm not sure if this is an accurate explanation. But that is what I
think is happening. Perhaps Phil or a person more experienced with the
inner workings can provide a better explanation.
A work-around would be to create a QMessageBox manually (i.e. not one of
those static public members) fill it with what you want and call .show()
depending on the state of the Systray widget (i.e. if
systray.isVisible() call exec_() else, call .show()).
darryl
More information about the PyQt
mailing list