gpt4 book ai didi

python - 无法使用 lambda 将参数传递给 pyqtslot

转载 作者:行者123 更新时间:2023-12-01 07:32:24 25 4
gpt4 key购买 nike

我尝试使用 lambda 表达式将实例作为参数传递给插槽,但我不断收到此错误:

TypeError: on_xOffsetSpinBox_editingFinished() missing 1 required positional argument: 'instance'

我尝试了 lambda 和partial 来传递实例参数,但两种方法都不起作用。

我想这样做的原因是我想在几个不同的类中重用相同的方法。

class AppWindow(QMainWindow):
def __init__(self):
...
self.ui.xOffsetSpinBox.editingFinished.connect(lambda: AppWindow.on_xOffsetSpinBox_editingFinished(self))
...

@staticmethod
def on_xOffsetSpinBox_editingFinished(instance):
...

我想使用这个静态方法作为不同对话类中另一个信号的槽。

最佳答案

TL; DR; 失败的是 Qt Designer 提供的自动连接,而不是您的显式连接。

<小时/>

我认为ui是Qt Designer生成的类的对象,如果你检查pyuic生成的代码,以下指令应该是:

QtCore.QMetaObject.connectSlotsByName(...)

connectSlotsByName()如果插槽具有以下模式,则方法会进行自动连接:

def on_<object name>_<signal name>(<signal parameters>):
# ...

在您的情况下,on_xOffsetSpinBox_editingFinished满足该要求,因为它有一个xOffsetSpinBox对象,该对象是一个QSpinBox,它有一个editingFinished 信号,您可以检查您是否对所建立的连接进行评论,您会发现您仍然观察到相同的问题。

<小时/>

一个可能的解决方案是更改静态方法的名称,使其与指示的模式不匹配,例如:

class AppWindow(QMainWindow):
def __init__(self):
# ...
self.ui.xOffsetSpinBox.editingFinished.connect(lambda: AppWindow.on_another_name(self))
# ...

@staticmethod
def on_another_name(instance):
# ...

另一个解决方案是使用 @pyqtSlot()装饰器通过传递与指示模式不匹配的名称参数来实现。

class AppWindow(QMainWindow):
def __init__(self):
# ...
self.ui.xOffsetSpinBox.editingFinished.connect(lambda: AppWindow.on_xOffsetSpinBox_editingFinished(self))
# ...

@staticmethod
@pyqtSlot(name="static_connection")
def on_xOffsetSpinBox_editingFinished(instance):
# ...

关于python - 无法使用 lambda 将参数传递给 pyqtslot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57154898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com