python pyQt4 listWidget 传递额外参数

python pyQt4 listWidget passing extra arguments

我在使用 PyQt4 中的 .itemClicked() 方法时遇到问题。

当我经常使用它时 例如:

 listObj.itemClicked.connect(some_function)

我可以在函数中使用它

def some_function(self,ITEM):

但我尝试通过 functools

的部分函数传递另一个参数
listObj.itemClicked.connect( partial(some_function, extra_argument) )

并将 ITEM 替换为 extra_argument。

我也试过使用 lambda 函数

listObj.itemClicked.connect(lambda: some_function(item, extra_argument))

这会起作用,但它会 return 一个元组,它会卡在我单击的第一个项目上。

例如

def some_function(self, ITEM, extra_argument):
    str(Item[0].text) # this would return a tuple with the second item 
                      # empty.

我查了一下,但我能找到的只是在按钮上传递额外的参数。

谢谢,

您应该按如下方式使用它:

extra_argument = {your value}
listObj.itemClicked.connect(lambda item, extra_argument= extra_argument: self.some_function(item, extra_argument))

def some_function(self, item, extra_argument):
    [...]

或者你可以使用 partial 但默认参数应该在末尾:

listObj.itemClicked.connect(partial(self.some_function, extra_argument))

def some_function(self, extra_argument, item):
    [...]

简短回答:您不能将双参数槽连接到单参数信号。这样做没有任何意义。 Qt 将无法为额外参数提供值。

当然你可以写一个Python函数来接收单参数信号,附加第二个参数,然后调用second函数。这就是您在尝试使用 lambda 时试图做的事情,它向 Qt 传递一个单参数函数,但在您的程序中发出一个双参数函数调用。这就是你的做法:

listObj.itemClicked.connect(lambda item: some_function(item, extra_argument))

但是请检查您提供的 link 以查看此方法的缺陷。确保你想要一个 lambda 表达式而不是一个闭包。这将是关闭方法:

def get_handler(self, extra):
    def h(item):
        some_function(item, extra)
    return h

listObj.itemClicked.connect(get_handler(extra_argument))

我发现我偶尔需要在 Qt 回调中使用闭包。