python - pyqt中使用lambda表达式连接槽

标签 python lambda pyqt

我正在尝试将槽与 lambda 函数连接起来,但它没有按我预期的方式工作。在下面的代码中,我成功地正确连接了前两个按钮。对于我在循环中连接的后两个,这是错误的。在我之前有人有同样的问题 ( Qt - Connect slot with argument using lambda ),但这个解决方案对我不起作用。我已经盯着屏幕看了半个小时,但我无法弄清楚我的代码有何不同。

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(QtGui.QWidget, self).__init__()

        main_layout = QtGui.QVBoxLayout(self)

        # Works:
        self.button_1 = QtGui.QPushButton('Button 1 manual', self)
        self.button_2 = QtGui.QPushButton('Button 2 manual', self)
        main_layout.addWidget(self.button_1)
        main_layout.addWidget(self.button_2)

        self.button_1.clicked.connect(lambda x:self.button_pushed(1))
        self.button_2.clicked.connect(lambda x:self.button_pushed(2))

        # Doesn't work:
        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)


    def button_pushed(self, num):
        print 'Pushed button {}'.format(num)

按下前两个按钮会产生“Pushed button 1”和“Pushed button 2”,另外两个按钮都会产生“Pushed button False”,尽管我预期是 3 和 4。

我也没有完全理解 lambda 机制。究竟是什么连接起来了?指向由 lambda 生成的函数的指针(其中参数被替换),还是在信号触发时评估 lambda 函数?

最佳答案

QPushButton.clicked 信号发出一个指示按钮状态的参数。当您连接到您的 lambda 插槽时,您分配给 idx 的可选参数将被按钮的状态覆盖。

相反,将您的连接设置为

button.clicked.connect(lambda state, x=idx: self.button_pushed(x))

这样按钮状态将被忽略,正确的值将传递给您的方法。

关于python - pyqt中使用lambda表达式连接槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35819538/

相关文章:

python - 如何在另一个线程中设置 qasync 事件循环?

python - 字符串如何存储为 'sequence of Unicode code points' ?

python - 从python中的字符串中提取罗马数字

c# - 使用 lambda 表达式进行复合选择

java - 为什么 hankcs/AhoCorasickDoubleArrayTrie 中的 lambda 示例不起作用?

python - PyQt 线程。获取动态输出

python - 是否有 pydbg 模块的 Perl 等效模块?

Python 将多个对象加载到映射中以在内存缓存中使用

javascript - Aurelia 上带有 json 文件的箭头函数

qt - 如何获取 QTableWidget 光标下的行