还有一个解决方案需要将按钮信号绑定到Qt中的插槽



我试图在Python中开发一个Slicer模块,使用qt.我有一个按钮列表(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.'

我已经使用了这里和这里建议的所有三种方法,但我有不同的问题:

  • 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)])

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

谢谢!

根据这个页面,pyQT在4.5之后引入了一个新的API

试试这个:

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

相关内容

  • 没有找到相关文章

最新更新