如何将动态生成的QPushButton传递给python中的SIGNAL处理函数?

时间:2016-11-02 19:47:13

标签: python pyqt

我正在尝试从行列表中创建一些新的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,但都是相同的。

我做错了什么? :/

2 个答案:

答案 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)