我在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.
我查了一下,但我能找到的只是在按钮上传递额外的参数。
谢谢,
答案 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):
[...]