[PyQt] Disposing of a QApplication
Sybren A. Stüvel
sybren at stuvel.eu
Fri Mar 12 10:17:16 GMT 2010
Hi all,
I'm working on a PyQt GUI application using PyQt 4.6 and Python 2.6. According
to the documentation:
For any GUI application using Qt, there is precisely one QApplication object
This is true for our application, but not for our unit tests. They start and
stop a QApplication in quick succession, so when the test stops it has to shut
down and dispose of the application properly. The application instance is
stored in 'self.app' of the unittest class, but just doing 'del self.app'
doesn't destroy the application (probably because there are other references
to it in the Qt modules).
Right now I start a separate thread that waits for a bit and then sends the
application the quit() signal. Then I start the application's main loop, so
that it is running when it receives the quit() signal from the other thread.
Of course, this is not an ideal way.
I tried a single-threaded approach by first sending it the quit() signal and
then run app.exec_() but that doesn't stop the application. Another approach I
used was to try and replace the event loop with the following code, but that
also doesn't stop the application.
def aboutToQuit():
self.fail("Quitting!")
self.app.aboutToQuit.connect(aboutToQuit)
# Send the quit event and let the application process it.
start_time = time.time()
while not self.app.closingDown():
self.app.quit()
self.app.processEvents()
self.app.sendPostedEvents(self.app, 0)
self.app.flush()
time.sleep(0.01)
# Wait three seconds for the app to stop.
if time.time() - start_time > 3.0:
self.fail("Failed to quit the application")
del self.app
self.fail("Done")
It's done in a unittest.TestCase class, and the self.fail() calls are there so
that I can quickly see what's going on.
What would you recommend?
--
Sybren A. Stüvel
sybren at stuvel.eu
http://stuvel.eu/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part.
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20100312/e9b2a229/attachment.pgp>
More information about the PyQt
mailing list