如何定义 lambda 函数来覆盖 Qt 中的多个槽?
How to define lambda functions to override several slots in Qt?
我尝试使用 lambda 函数调用一个方法,该方法从不提供任何参数的插槽中获取参数(QtWidgets.QGroupBox.clicked() 只是在不发出任何内容的情况下触发)。
我为几种灯光类型自动构造了几个 QtWidgets.QGroupBox。每个人都应该在 3D 环境中切换 on/off 一种照明。此切换将通过检查 groupBox 的 lightType 来驱动,因此此插槽应传递其类型和状态。
这是一个简化的代码:
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 中以保留每个的引用,并且最后全部添加到它出现的 dockPanel 中。
我确实希望每个 lightTypeBox 都有自己的 lambda 函数连接,将适当的参数(lightType、param、bool)传递给在我的 class 中定义的函数 self.updateLighting MainWindow(QtWidgets.QMainWindow):
@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(...) 签名,因为我希望将它与其他 lambda 一起使用(对于 QspinBox、QDoubleSpinBox 等等,仍然要返回它们的设置,对于哪些灯,对于哪些参数,什么价值...)。
但我目前拥有的是我所有的组框 check/uncheck 确实使用最后一个 slotLambda 定义,就好像只定义了一个 lambda 函数,即使在第二个 for 中定义也是如此。
我应该怎么做?我确实尝试将 lambda 放在一个列表中,在一个 dic 中,希望将它们分开,而不是在每个参数传递时重写。不知道看清楚了没...
无论如何,你看到这里了吗?
好的,
我知道了:
我刚刚定义了传递给 lambda 的输入属性:
slotLambda = lambda lightType=lightType, param=param, lightTypeBox=lightTypeBox: self.updateLighting(lightType, param, lightTypeBox.isChecked())
所以每个 lambda 都有自己的参数:-)。
我尝试使用 lambda 函数调用一个方法,该方法从不提供任何参数的插槽中获取参数(QtWidgets.QGroupBox.clicked() 只是在不发出任何内容的情况下触发)。
我为几种灯光类型自动构造了几个 QtWidgets.QGroupBox。每个人都应该在 3D 环境中切换 on/off 一种照明。此切换将通过检查 groupBox 的 lightType 来驱动,因此此插槽应传递其类型和状态。
这是一个简化的代码:
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 中以保留每个的引用,并且最后全部添加到它出现的 dockPanel 中。
我确实希望每个 lightTypeBox 都有自己的 lambda 函数连接,将适当的参数(lightType、param、bool)传递给在我的 class 中定义的函数 self.updateLighting MainWindow(QtWidgets.QMainWindow):
@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(...) 签名,因为我希望将它与其他 lambda 一起使用(对于 QspinBox、QDoubleSpinBox 等等,仍然要返回它们的设置,对于哪些灯,对于哪些参数,什么价值...)。
但我目前拥有的是我所有的组框 check/uncheck 确实使用最后一个 slotLambda 定义,就好像只定义了一个 lambda 函数,即使在第二个 for 中定义也是如此。
我应该怎么做?我确实尝试将 lambda 放在一个列表中,在一个 dic 中,希望将它们分开,而不是在每个参数传递时重写。不知道看清楚了没...
无论如何,你看到这里了吗?
好的,
我知道了:
我刚刚定义了传递给 lambda 的输入属性:
slotLambda = lambda lightType=lightType, param=param, lightTypeBox=lightTypeBox: self.updateLighting(lightType, param, lightTypeBox.isChecked())
所以每个 lambda 都有自己的参数:-)。