【问题标题】:Cannot connect multiple widgets to the same slot无法将多个小部件连接到同一个插槽
【发布时间】:2015-03-09 22:19:41
【问题描述】:

我正在使用 for 循环创建一系列按钮,我希望它们都在单击时触发相同的方法,但在该方法中我需要检查单击了哪个按钮。使用下面的代码,当单击任何按钮时,该方法始终认为单击了“按钮 4”,即使单击了另一个按钮。

如何更改我的代码以让“打印机”方法识别各个按钮?

import sys
from PySide import QtGui, QtCore


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


    def initUI(self):  
        hbox = QtGui.QHBoxLayout()
        self.setLayout(hbox)
        self.setWindowTitle('Buttons test')
        self.show()

        buttons = {}
        for n in range(0, 5):
            buttons[n] = QtGui.QPushButton()
            buttons[n].setText('Button ' + str(n))
            hbox.addWidget(buttons[n])
            buttons[n].released.connect( lambda : self.printer( object_name=buttons[n].text() ) )


    def printer(self, object_name):
        print object_name


def main():
    app = QtGui.QApplication(sys.argv)
    ex = MyTest()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

我正在使用 PySide 执行此操作,但我认为这与 PyQt 的解决方案相同。

【问题讨论】:

    标签: python pyqt pyside


    【解决方案1】:

    您不需要为此使用 lambda。只需连接事件,然后使用sender() 在函数中获取调用它的对象。

    连接按钮事件:

    buttons[n].released.connect(self.printer)
    

    打印机功能:

    def printer(self):
        print self.sender().text() 
    

    我在 PyQt 上试过这个,但我目前没有安装 PySide 来测试它,但它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多