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 回调中使用闭包。
我在使用 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 回调中使用闭包。