python pyQt4 listWidget传递额外的参数

时间:2017-04-25 01:21:57

标签: python python-2.7 pyqt pyqt4 qlistwidget

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

当我经常使用它时:

 listObj.itemClicked.connect(some_function)

我可以在函数中使用它

def some_function(self,ITEM):

但我尝试使用functools

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

并用extra_argument替换ITEM。

我也尝试过使用lambda函数

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

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

实施例

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

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

谢谢,

How to pass an extra arguments to PyQt slot?

2 个答案:

答案 0 :(得分:1)

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

当然,你可以编写一个Python函数来接收单参数信号,附加第二个参数,然后调用 second 函数。当你试图使用lambda时,你试图做的是什么,它将一个参数函数传递给Qt,但在你的程序中发出一个双参数函数调用。这就是你如何做到的:

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

但请检查您提供的链接,以便通过此方法查看陷阱。确保你想要一个lambda表达式而不是一个闭包。这将是封闭方法:

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

listObj.itemClicked.connect(get_handler(extra_argument))

我发现我需要偶尔使用Qt回调来关闭。

答案 1 :(得分:0)

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

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):
    [...]