另一种解决方案是将按钮信号绑定到Qt中的插槽

时间:2014-08-19 11:41:29

标签: python qt lambda signals functools

我正在尝试使用qt在Python中开发一个Slicer模块。我有一个按钮列表(QPushButton),我希望每个"clicked"信号绑定到同一个方法,但传递不同的参数(这只是知道按下了什么按钮< /强>)。

我正在寻找的是这样的:

def createButtons(self):
  for object in self.myList:
    button = qt.QPushButton(object.name)
    button.clicked.connect(self.myMethod(object.name)) # I know this is not valid

def myMethod(self, name):
  print name, 'was pressed.'

我已经使用了herehere建议的所有三种方式,但我遇到了不同的问题:

  • QSignalMapper解决方案很乱,因为我无法使用PyQt / PySide。

  • lambda解决方案使我的代码打印始终是最后一个按钮的文本,无论按哪一个。我写了类似的东西:

    button.clicked.connect(lambda : self.myMethod(object.name))
    
  • 部分解决方案实施为:

    button.clicked.connect(functools.partial(self.myMethod, object.name))
    

    但是我收到了以下错误:

    TypeError: myMethod() takes exactly 2 arguments (3 given)
    

现在我正在使用一系列不同的书面方法,所以我的丑陋解决方案是:

button.clicked.connect(self.myButtonMethods[self.myList.index(object)])

我希望以前没有问过我的问题,你可以帮助我。

谢谢!

1 个答案:

答案 0 :(得分:1)

根据this page,4.5之后的pyQT引入了新的API

试试这个:

QtCore.QObject.connect(button, QtCore.SIGNAL('clicked()'), functools.partial(self.myMethod, object.name) )