如何将函数连接到PyQt5中动态创建的QPushButtons

时间:2019-01-08 21:08:27

标签: python pyqt5

我正在将QPushButtons动态添加到QTableWidget中的每一行。

当我单击按钮时,我希望它打开基于同一行中数据的链接。

只有先选择该行,然后单击按钮,我才能使其正常工作。

我希望能够单击按钮而不必先单击行。

这是我所拥有的片段:

def populate_table(self):
    instances = []

    table = self.ui.ESC_tableWidget
    table.setRowCount(0)


    button_dict = {}

    for esc_inst in instances:
        button_dict[esc_inst.esc_id] = QtWidgets.QPushButton('Open link')
        rowPosition = table.rowCount()
        table.insertRow(rowPosition)
        table.setItem(rowPosition , 0 , QtWidgets.QTableWidgetItem(esc_inst.esc_id))
        .
        .
        .
        esc_table.setCellWidget(rowPosition, 5 , button_dict[esc_inst.esc_id] )



    for button in button_dict.values():
        button.clicked.connect(self.open_link)



def open_link(self):
    selected_esc_id = table.item(table.currentRow(), 0).text()

因此,我需要绕过table.currentRow()函数,因为如果选择了一行,它将返回正确的行号。如果我直接单击按钮而不先选择行,则返回先前选择的行号。

我只能想到一些骇人听闻的解决方案,例如创建orderedDict之类的东西,但是看来这是一件微不足道的事情,我确信我会丢失一些东西。

有什么办法可以克服这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以让您的按钮单击回调接收一些定义按钮的参数。将回调附加到按钮时,请为每个调用回调的按钮创建一个单独的lambda函数,但要使用索引:

for i, button in enumerate(button_dict.values()):
        button.clicked.connect(lambda checked, i=i: self.open_link(i))

然后,在您的回调中:

def open_link(self, i):
    selected_esc_id = table.item(i, 0).text()

您需要在lambda中使用i=i部分,因为否则,它只会将i的最后一个值传递给您的回调。包括该部分之后,每个按钮都会将不同的i传递给您的回调方法。