为什么将 Lambda 表达式与 PyQt 槽一起使用会导致意外行为?

Patricia Arquette
发布: 2024-11-19 20:43:02
原创
878 人浏览过

Why Does Using Lambda Expressions With PyQt Slots Lead to Unexpected Behavior?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板