Added workaround for Qt crash-at-exit bug (make sure that all GraphicsItems live in a scene before exiting)

This commit is contained in:
Luke Campagnola 2012-06-18 14:01:51 -04:00
parent 6932c34126
commit 364337083f

View File

@ -119,11 +119,27 @@ from .SignalProxy import *
from .ptime import time from .ptime import time
## Workaround for Qt exit crash:
## ALL QGraphicsItems must have a scene before they are deleted.
## This is potentially very expensive, but preferred over crashing.
import atexit
def cleanup():
if QtGui.QApplication.instance() is None:
return
import gc
s = QtGui.QGraphicsScene()
for o in gc.get_objects():
try:
if isinstance(o, QtGui.QGraphicsItem) and o.scene() is None:
s.addItem(o)
except RuntimeError: ## occurs if a python wrapper no longer has its underlying C++ object
continue
atexit.register(cleanup)
## Convenience functions for command-line use ## Convenience functions for command-line use
plots = [] plots = []
images = [] images = []
QAPP = None QAPP = None
@ -176,8 +192,8 @@ show = image ## for backward compatibility
def mkQApp(): def mkQApp():
global QAPP
if QtGui.QApplication.instance() is None: if QtGui.QApplication.instance() is None:
global QAPP
QAPP = QtGui.QApplication([]) QAPP = QtGui.QApplication([])
return QAPP