我正在尝试从行列表中创建一些新的QPushButton
,然后使用Event Handler Function
将它们连接到connect
,但无论我做什么,我都无法连接它们分别到功能。
代码就像这样
def addItemButtons(self,chosen):
# ----------- DELETE OLD BUTTONS ------------
for i in reversed(range(self.layoutbottom.count())):
self.layoutbottom.itemAt(i).widget().setParent(None)
# ----------- MAKE A NEW BUTTON FOR EACH CHOSEN ENTRY -----------
for d in chosen:
itembtn = QPushButton("ID : "+str(d['id']))
itembtn.clicked.connect(lambda : self.handlerFunction(str(d['id'])))
self.layoutbottom.addWidget(itembtn)
def handlerFunction(self,txt):
print(txt)
当我点击新按钮时,handlerFucntion
只打印最后一个按钮id
!
我搜索并使用不同的方法将按钮连接到handlerFunction,但都是相同的。
我做错了什么? :/
答案 0 :(得分:1)
以及!我解决了,但我不确切知道如何! 这就是我为解决问题所做的工作:
for d in chosen:
itembtn = QPushButton("ID : "+str(d['id']))
self.connect(itembtn,SIGNAL('clicked()'),self.handleFunction)
self.layoutbottom.addWidget(itembtn)
然后我将handlerFunction
更改为:
def handleDriverSelection(self):
print (self.sender().text()
之前我做了同样的事情但是在完成所有这些之后连接按钮的差异现在它正在工作!也许我在那里做错了什么。无论如何。这对我有用。 :)
答案 1 :(得分:1)
问题是d['id']
的值在循环完成之前没有被评估,所以当所有按钮都被连接时,只有最后id
被发送。您需要确保在循环期间评估id
值。
您可以使用functools.partial
执行此操作
from functools import partial
for d in chosen:
itembtn = QPushButton("ID : "+str(d['id']))
itembtn.clicked.connect(partial(self.handlerFunction, str(d['id'])))
self.layoutbottom.addWidget(itembtn)