我正在将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之类的东西,但是看来这是一件微不足道的事情,我确信我会丢失一些东西。
有什么办法可以克服这个问题吗?
答案 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
传递给您的回调方法。