Как передать текст динамически сгенерированной кнопки в функцию
У меня есть массив данных, которых я хочу вывести в QTableWidget. Для этого я в цикле for в каждом ряду создаю необходимые мне элементы для каждой колонки:
for row,i enumerate(data):
# В этом месте я создаю другие элементы, которые не относятся к проблеме
blockButton = QtWidgets.QPushButton()
blockButton.setText(i['textForButton'])
blockButton.clicked.connect(lambda: self.blockChannel(blockButton.text()))
self.ui.recommend_channelList.setCellWidget(row, 2, blockButton)
Я таблицу выводятся кнопки с уникальным текстом для каждой, но когда я нажимаю на кнопку и срабатывает вызов метода blockChannel(), в который я передаю текст кнопки, по которой я нажал:
def blockChannel(self, text):
print(f"Полученный текст: {text}")
То print выводит текст самой последней кнопки из таблицы.
Я пробовал передавать значения в text, accessibleDescription, но результат всегда оставался прежним.
Как мне добиться передачи информации из данных кнопки, будь это текст или что-то другое, куда я могу поместить нужную мне информацию в функцию, которая должна быть выполнена по нажатию на неё?
Напомню, что все кнопки генерируются в цикле.
Ответы (1 шт):
Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример.
Функция lambda должна выглядеть так:
blockButton.clicked.connect(
lambda ch, text=blockButton.text(): self.blockChannel(text))
import sys
from PyQt5.Qt import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
data =[{'textForButton': f'button_{i}'} for i in range(10)]
table = QTableWidget(10, 3, self)
table.setHorizontalHeaderLabels(["one", "two"])
table.verticalHeader().hide()
for row, i in enumerate(data):
# В этом месте я создаю другие элементы, которые не относятся к проблеме
blockButton = QPushButton()
blockButton.setText(i['textForButton'])
# --- blockButton.clicked.connect(lambda: self.blockChannel(blockButton.text()))
# +++
blockButton.clicked.connect( # +++
lambda ch, text=blockButton.text(): self.blockChannel(text)) # +++
table.setCellWidget(row, 2, blockButton)
table.resizeColumnsToContents()
table.resizeRowsToContents()
grid_layout = QGridLayout(central_widget)
grid_layout.addWidget(table, 0, 0)
def blockChannel(self, text):
print(f"Полученный текст: {text}")
QMessageBox.information(self, 'clicked', f'Вы нажали {text}')
if __name__ == "__main__":
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec())
