lambdas which reference self prevent GC

This commit is contained in:
Martin 2021-02-21 06:49:07 -08:00
parent 5b1ac7acaa
commit 7f4f677ce1
4 changed files with 64 additions and 19 deletions

View File

@ -446,10 +446,10 @@ class GradientEditorItem(TickSliderItem):
self.rgbAction = QtGui.QAction(translate("GradiantEditorItem", 'RGB'), self)
self.rgbAction.setCheckable(True)
self.rgbAction.triggered.connect(lambda: self.setColorMode('rgb'))
self.rgbAction.triggered.connect(self.setColorModeToRGB)
self.hsvAction = QtGui.QAction(translate("GradiantEditorItem", 'HSV'), self)
self.hsvAction.setCheckable(True)
self.hsvAction.triggered.connect(lambda: self.setColorMode('hsv'))
self.hsvAction.triggered.connect(self.setColorModeToHSV)
self.menu = QtGui.QMenu()
@ -493,7 +493,7 @@ class GradientEditorItem(TickSliderItem):
self.updateGradient()
self.linkedGradients = {}
self.sigTicksChanged.connect(lambda *args, **kwargs: self.updateGradient())
self.sigTicksChanged.connect(self.updateGradientIgnoreArgs)
self.sigTicksChangeFinished.connect(self.sigGradientChangeFinished.emit)
def showTicks(self, show=True):
@ -567,6 +567,12 @@ class GradientEditorItem(TickSliderItem):
self.sigTicksChanged.emit(self)
self.sigGradientChangeFinished.emit(self)
def setColorModeToRGB(self):
self.setColorMode("rgb")
def setColorModeToHSV(self):
self.setColorMode("hsv")
def colorMap(self):
"""Return a ColorMap object representing the current state of the editor."""
if self.colorMode == 'hsv':
@ -585,6 +591,9 @@ class GradientEditorItem(TickSliderItem):
self.gradRect.setBrush(QtGui.QBrush(self.gradient))
self.sigGradientChanged.emit(self)
def updateGradientIgnoreArgs(self, *args, **kwargs):
self.updateGradient()
def setLength(self, newLen):
#private (but maybe public)
TickSliderItem.setLength(self, newLen)

View File

@ -110,8 +110,8 @@ class LinearRegionItem(GraphicsObject):
for l in self.lines:
l.setParentItem(self)
l.sigPositionChangeFinished.connect(self.lineMoveFinished)
self.lines[0].sigPositionChanged.connect(lambda: self.lineMoved(0))
self.lines[1].sigPositionChanged.connect(lambda: self.lineMoved(1))
self.lines[0].sigPositionChanged.connect(self.line0Moved)
self.lines[1].sigPositionChanged.connect(self.line1Moved)
if brush is None:
brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 50))
@ -242,6 +242,12 @@ class LinearRegionItem(GraphicsObject):
self.prepareGeometryChange()
self.sigRegionChanged.emit(self)
def line0Moved(self):
self.lineMoved(0)
def line1Moved(self):
self.lineMoved(1)
def lineMoveFinished(self):
self.sigRegionChangeFinished.emit(self)

View File

@ -785,7 +785,10 @@ class ROI(GraphicsObject):
def removeClicked(self):
## Send remove event only after we have exited the menu event handler
QtCore.QTimer.singleShot(0, lambda: self.sigRemoveRequested.emit(self))
QtCore.QTimer.singleShot(0, self.emitRemoveRequest)
def emitRemoveRequest(self):
self.sigRemoveRequested.emit(self)
def mouseDragEvent(self, ev):
self.mouseDragHandler.mouseDragEvent(ev)

View File

@ -203,15 +203,15 @@ class Parameter(QtCore.QObject):
self.opts['default'] = None
## Connect all state changed signals to the general sigStateChanged
self.sigValueChanged.connect(lambda param, data: self.emitStateChanged('value', data))
self.sigChildAdded.connect(lambda param, *data: self.emitStateChanged('childAdded', data))
self.sigChildRemoved.connect(lambda param, data: self.emitStateChanged('childRemoved', data))
self.sigParentChanged.connect(lambda param, data: self.emitStateChanged('parent', data))
self.sigLimitsChanged.connect(lambda param, data: self.emitStateChanged('limits', data))
self.sigDefaultChanged.connect(lambda param, data: self.emitStateChanged('default', data))
self.sigNameChanged.connect(lambda param, data: self.emitStateChanged('name', data))
self.sigOptionsChanged.connect(lambda param, data: self.emitStateChanged('options', data))
self.sigContextMenu.connect(lambda param, data: self.emitStateChanged('contextMenu', data))
self.sigValueChanged.connect(self.emitValueChanged)
self.sigChildAdded.connect(self.emitChildAddedChanged)
self.sigChildRemoved.connect(self.emitChildRemovedChanged)
self.sigParentChanged.connect(self.emitParentChanged)
self.sigLimitsChanged.connect(self.emitLimitsChanged)
self.sigDefaultChanged.connect(self.emitDefaultChanged)
self.sigNameChanged.connect(self.emitNameChanged)
self.sigOptionsChanged.connect(self.emitOptionsChanged)
self.sigContextMenu.connect(self.emitContextMenuChanged)
#self.watchParam(self) ## emit treechange signals if our own state changes
@ -511,6 +511,33 @@ class Parameter(QtCore.QObject):
self.treeStateChanges.append((self, changeDesc, data))
self.emitTreeChanges()
def emitValueChanged(self, param, data):
self.emitStateChanged("value", data)
def emitChildAddedChanged(self, param, *data):
self.emitStateChanged("childAdded", data)
def emitchildRemovedChanged(self, param, data):
self.emitStateChanged("childRemoved", data)
def emitParentChanged(self, param, data):
self.emitStateChanged("parent", data)
def emitLimitsChanged(self, param, data):
self.emitStateChanged("limits", data)
def emitDefaultChanged(self, param, data):
self.emitStateChanged("default", data)
def emitNameChanged(self, param, data):
self.emitStateChanged("name", data)
def emitOptionsChanged(self, param, data):
self.emitStateChanged("options", data)
def emitContextMenuChanged(self, param, data):
self.emitStateChanged("contextMenu", data)
def makeTreeItem(self, depth):
"""
Return a TreeWidgetItem suitable for displaying/controlling the content of