无法使用lambd将参数传递给pyqtslot

2024-09-30 12:14:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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):
    ...

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


Tags: 实例方法instancelambdaself表达式ondef
1条回答
网友
1楼 · 发布于 2024-09-30 12:14:30

TL;DR;失败的是Qt设计器提供的自动连接,而不是显式连接。你知道吗


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

QtCore.QMetaObject.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()装饰器,通过传递与指定模式不匹配的name参数。你知道吗

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):
        # ...

相关问题 更多 >

    热门问题