Wed Mar 10 18:13:52 CET 2010 Tobias Rautenkranz * Delete QPainDevices before the QApplication is destroyed. Mon Jan 25 20:09:40 CET 2010 Tobias Rautenkranz * Fix with-app cleanup Mon Jan 25 19:50:16 CET 2010 Tobias Rautenkranz * Fix with-painter diff -rN -u old-qt.gui/src/application.lisp new-qt.gui/src/application.lisp --- old-qt.gui/src/application.lisp 2015-08-03 19:38:46.182862281 +0200 +++ new-qt.gui/src/application.lisp 2015-08-03 19:38:47.731755006 +0200 @@ -2,7 +2,7 @@ (defvar *widgets* nil) -(defmethod delete-app :around ((application qt:application)) +(defmethod cl-smoke.qt.core:delete-app :around ((application qt:application)) (qt:application.close-all-windows) ;; widgets are only valid as long, as an application object ;; exists. QApplication::~QApplication() deletes all widgets in @@ -11,6 +11,13 @@ ;; see: qt4/src/gui/kernel/qapplication.cpp (loop for widget across (qt:application.all-widgets) do (tg:cancel-finalization widget)) + ;; QPaintDevices are only valid when a application object exists. + (loop for object being the hash-values of smoke::*object-map* do + (when (typep object 'qt:paint-device) + (delete-object object))) + ;; Finalize other stuff before deleting the QApplication, + ;; e.g. QGraphicsScene + (tg:gc :full t) (call-next-method) (setf *widgets* nil)) diff -rN -u old-qt.gui/src/painter.lisp new-qt.gui/src/painter.lisp --- old-qt.gui/src/painter.lisp 2015-08-03 19:38:46.396847461 +0200 +++ new-qt.gui/src/painter.lisp 2015-08-03 19:38:48.224720864 +0200 @@ -7,16 +7,16 @@ Makes sure the painter ends after BODY; thus preventing problems with still active and not yet garbage collected painters in CXX:PAINT-EVENT." - (when paint-device - `(let ((,painter (make-instance 'qt:painter :arg0 ,paint-device))) - (assert (cxx:is-active ,painter) - (,painter) - "Painter ~A for ~A is not active" - ,painter ,paint-device) - (unwind-protect - (progn ,@body) - (cxx:end ,painter))) - `(progn (cxx:save ,painter) - (unwind-protect - (progn ,@body) - (cxx:restore ,painter))))) + (if paint-device + `(let ((,painter (make-instance 'qt:painter :arg0 ,paint-device))) + (assert (cxx:is-active ,painter) + (,painter) + "Painter ~A for ~A is not active" + ,painter ,paint-device) + (unwind-protect + (progn ,@body) + (cxx:end ,painter))) + `(progn (cxx:save ,painter) + (unwind-protect + (progn ,@body) + (cxx:restore ,painter)))))