在 PyQt 中使用 Lambda 表达式连接槽
在 PyQt 中,lambda 表达式可用于将信号连接到槽。但是,在某些场景中使用 lambda 表达式可能会导致意外行为。
请考虑以下代码:
class MainWindow(QtGui.QWidget): def __init__(self): ... self.buttons = [] for idx in [3, 4]: button = QtGui.QPushButton('Button {} auto'.format(idx), self) button.clicked.connect(lambda x=idx: self.button_pushed(x)) self.buttons.append(button) main_layout.addWidget(button)
单击按钮时,接收的不是预期值 3 和 4 ,button_pushed 方法接收 False。
此行为的原因是 QPushButton 的单击信号发出一个参数,该参数指示按钮的状态。在槽中使用 lambda 表达式时,分配的值(例如本例中的 x=idx)会被发出的参数覆盖。
要解决此问题,lambda 表达式应忽略按钮状态并使用一个附加的命名参数:
button.clicked.connect(lambda state, x=idx: self.button_pushed(x))
此修改可确保将正确的值传递给 button_pushed 方法,无论按钮的状态如何state.
理解 lambda 表达式的机制也至关重要。在槽连接的上下文中,当信号触发时,不会评估 lambda 函数。相反,指向函数的指针(带有替换的参数)连接到信号。当信号发出时,将使用信号传递的参数调用连接的函数。
以上是为什么将 Lambda 表达式与 PyQt 槽一起使用会导致意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!