Python PyQt:如何将QComboBox连接到带有参数的函数

Python PyQt:如何将QComboBox连接到带有参数的函数,python,pyqt,Python,Pyqt,QComboBox使用以下语法连接到函数: myComboBox.activated.connect(self.myFunction ) 但是我需要能够将参数从ComboBox发送到myFunction()。但如果我使用: myComboBox.activated.connect(self.myFunction(myArg1, myArg2 ) 我越来越 TypeError: connect() slot argument should be a callable or a signal,

QComboBox使用以下语法连接到函数:

myComboBox.activated.connect(self.myFunction )
但是我需要能够将参数从ComboBox发送到myFunction()。但如果我使用:

myComboBox.activated.connect(self.myFunction(myArg1, myArg2 )
我越来越

TypeError: connect() slot argument should be a callable or a signal, not 'NoneType'
需要使用什么语法将QComboBox连接到能够接收从ComboBox发送的参数的函数

稍后编辑: 以下是导致TypeError的代码:

connect()插槽参数应该是可调用的或信号,而不是“NoneType”



在我发布了一个问题后,我建议了一个链接,解释了很多。答案如下:

from PyQt4 import QtCore, QtGui

class MyClass(object):
    def __init__(self, arg):
        super(MyClass, self).__init__()
        self.arg = arg        

class myWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)

        self.comboBox = QtGui.QComboBox(self)
        self.comboBox.addItems([str(x) for x in range(3)])

        self.myObject=MyClass(id(self) )

        slotLambda = lambda: self.indexChanged_lambda(self.myObject)
        self.comboBox.currentIndexChanged.connect(slotLambda)

    @QtCore.pyqtSlot(str)
    def indexChanged_lambda(self, string):
        print 'lambda:', type(string), string

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myApp')
    dialog = myWindow()
    dialog.show()
    sys.exit(app.exec_())

好的,我会在你最初的问题中发现你的代码失败的原因。没有投票赞成吗?您找到的代码确实有效,但它并不能解释为什么您的代码首先会失败。您应该发布链接,因为尽管我们感谢您花时间发布您自己问题的解决方案,但这还不够。@RaydelMiranda:很抱歉,您并没有真正做到您所声称的。代码失败的原因是
connect
方法期望传递一个函数对象给它,但OP实际传递了
None
给它(在尝试将参数传递给他的函数时,他实际调用了它)。简单的解决方案是将用参数调用的
myFunction
包装成一个特殊的:
lambda:self.myFunction(self.myObject,'someArg')
但是当@alphanumeric需要的是一个简单的回调时,你却有点偏离了插槽和信号机制的问题。可能的外观重复请使用你的代码并更改
self.comboBox.activated.connect(self.myFunction(self.myObject,'someArg'))
by
self.comboBox.activated.connect(self.myFunction)
它非常适合我。正如我所说,连接插槽时不需要指定参数。@Sputnix我认为您误解了信号和插槽的工作方式。不能对特定信号发送任意类型的参数。
QComboBox
的信号
activate
发出
int
参见:。所以你必须定义你自己的信号,一个发出你想要的值类型的信号(
MyClass
对于self.myObject和
str
对于
someArg
)。然后,您可以从处理
activate
事件的函数发出信号。当然,您自己的信号也需要一个处理程序/插槽。@Sputnix内置信号知道(这是预定义的)要发送到插槽的参数的数量和类型。您只需实现一个准备好接收此类参数的插槽。如果信号不处理您需要的参数类型,那么,同样,您需要一个自定义信号。@字母数字:当试图将参数传递给
myFunction
时,您调用了它,然后
None
被传递给
connect
,而不是
myFunction
本身。解决方案是用一个特殊的函数包装调用,并传递它:
lambda:self.myFunction(self.myObject,'someArg')
。这是解决这个问题的标准方法。你也可以用同样的方法,例如
tkinter
from PyQt4 import QtCore, QtGui

class MyClass(object):
    def __init__(self, arg):
        super(MyClass, self).__init__()
        self.arg = arg        

class myWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)

        self.comboBox = QtGui.QComboBox(self)
        self.comboBox.addItems([str(x) for x in range(3)])

        self.myObject=MyClass(id(self) )

        slotLambda = lambda: self.indexChanged_lambda(self.myObject)
        self.comboBox.currentIndexChanged.connect(slotLambda)

    @QtCore.pyqtSlot(str)
    def indexChanged_lambda(self, string):
        print 'lambda:', type(string), string

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myApp')
    dialog = myWindow()
    dialog.show()
    sys.exit(app.exec_())