如何定义lambda函数来覆盖Qt中的几个槽



我尝试使用lambda函数来调用一个方法,该方法从不提供任何参数的slot中获取参数(QtWidgets.QGroupBox.clicked((只触发而不发出任何内容(。

我为几种灯光类型自动构建了几个QtWidgets.QGroupBox。每个都应该在三维环境中打开/关闭某种照明。此切换将由检查lightType的groupBox来驱动,因此此插槽应传递其类型和状态。

这是一个简化的代码:

for lightType in A_CERTAIN_LIST:
lightTypeBox = QtWidgets.QGroupBox(lightType, self.lightingDock)
for param in a A_CERTAIN_DIC.keys():
if param IS_THE_BOOL_PARAM:
slotLambda = lambda: self.updateLighting(lightType, param, lightTypeBox.isChecked())
lightTypeBox.clicked.connect(slotLambda)
...

创建的lightTypeBox也被添加到dic中,以保留每个的ref,并在最后添加到它出现的dockPanel中。

我确实希望每个lightTypeBox都连接自己的lambda函数,并将适当的参数(lightType、param、bool(传递给在我的类MainWindow(QtWidgets.QMainWindow(中定义的函数self.updateLighting:

@Slot(str, str, bool)
@Slot(str, str, int)
@Slot(str, str, float)
def updateLighting(self, lighting, param, val):
self.canvas.mainRenderer.setLighting(lighting, param, val)

这有几个@Slot(…(签名,我希望将其与其他lambdas一起使用(对于QspinBox、QDoubleSpinBox等,仍然需要返回它们的设置,对于哪种光,对于哪些参数,什么值…(。

但我目前所拥有的是,我所有的组框在选中/取消选中时都使用了定义的最后一个slotLambda,就好像只定义了一个lambda函数一样,即使是在第二个的内部定义的。

我应该采取什么不同的做法?我确实试着把lambdas放在一个列表中,放在dic中,希望能把它们分开,而不是在每次参数传递时重写。我不知道它是否清楚。。。

不管怎样,你看到什么了吗?

好的,

我明白了:

我刚刚定义了传递给lambda:的输入属性

slotLambda=lambda lightType=lightType,param=param,lightTypeBox=lightTypeBox:self.updateLighting(lightType,aram,lightType Box.isChecked(((

因此,每个lambda都有自己的参数:-(。

最新更新