From 047978ea5222ca4553fdfa997e1cedc8e54fd99b Mon Sep 17 00:00:00 2001 From: David Vierra Date: Tue, 15 Sep 2015 01:12:22 -1000 Subject: [PATCH] DON'T EVER capture `self` in a closure like this! When a Qt signal is connected to a function that closes over any references, the GC can't ever detect this cycle: self -> some QObject -> Signal handler wrapper -> function with closure -> self. ALWAYS use QSignalMapper instead of doing this crap! --- src/mcedit2/editorsession.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/mcedit2/editorsession.py b/src/mcedit2/editorsession.py index e663ba4..793414d 100644 --- a/src/mcedit2/editorsession.py +++ b/src/mcedit2/editorsession.py @@ -347,23 +347,20 @@ class EditorSession(QtCore.QObject): # --- Dimensions --- - def _dimChanged(f): - def _changed(): - self.gotoDimension(f) - - return _changed - dimButton = self.changeDimensionButton = QtGui.QToolButton() dimButton.setText(self.dimensionMenuLabel("")) dimAction = self.changeDimensionAction = QtGui.QWidgetAction(self) dimAction.setDefaultWidget(dimButton) dimMenu = self.dimensionsMenu = QtGui.QMenu() + self.dimMapper = QtCore.QSignalMapper() + self.dimMapper.mapped[str].connect(self.gotoDimension) + for dimName in self.worldEditor.listDimensions(): displayName = self.dimensionDisplayName(dimName) action = dimMenu.addAction(displayName) - action._changed = _dimChanged(dimName) - action.triggered.connect(action._changed) + self.dimMapper.setMapping(action, dimName) + action.triggered.connect(self.dimMapper.map) dimButton.setMenu(dimMenu) dimButton.setPopupMode(QtGui.QToolButton.InstantPopup)