PyQt: Как подключить автоматически добавленные кнопки

#python #pyqt #pyqt5

Вопрос:

Программа, которую я пытаюсь написать, добавляет кнопку для каждого элемента в списке

 for elem in add_new:  counter = add_new.index(elem)  name = add_new_names[counter]   self.button = QPushButton(name)  self.button.setObjectName('button_'   str(name))  self.button.setFixedWidth(200)  self.button.setFixedHeight(200)  self.stacked_layout.addWidget(self.button)  self.mygroupbox.setLayout(self.stacked_layout)   self.scroll.setWidget(self.mygroupbox)  

Это работает, но теперь я хочу подключить эти кнопки к событию/функции. Если я добавлю

 self.button.clicked.connect(self.clickevent)  

он выполняет функцию (очевидно) независимо от того, какая кнопка нажата. Есть ли способ подключить автоматически добавляемые кнопки к различным функциям/событиям?

ИЗМЕНИТЬ: Чтобы предоставить больше кода

 class AppDemo(QWidget):  def __init__(self):  super().__init__()  self.first_time = "True"   self.setAcceptDrops(True)   self.mainLayout = QVBoxLayout()   self.drop_label = ImageLabel()  self.mainLayout.addWidget(self.drop_label)   self.myform = QHBoxLayout()  self.mygroupbox = QGroupBox('selected pdf files')   self.scroll = QScrollArea()  self.scroll.setWidgetResizable(True)  self.scroll.setFixedHeight(300)  self.mainLayout.addWidget(self.scroll)   self.stacked_layout = QHBoxLayout()   self.setLayout(self.mainLayout)   def dragEnterEvent(self, event):  if self.find_pdf(event.mimeData()):  event.accept()  else:  event.ignore()   def dragMoveEvent(self, event):  if self.find_pdf(event.mimeData()):  event.accept()  else:  event.ignore()   def dropEvent(self, event):  add_new.clear()  add_new_names.clear()  urls = self.find_pdf(event.mimeData())  if urls:  for url in urls:  self.path = url.toLocalFile()  self.file_name = QFileInfo(self.path)  self.filename = self.file_name.baseName()  link_list.append(self.path)  title_list.append(self.filename)  list_of_links.append(self.path)  add_new.append(self.path)  add_new_names.append(self.filename)  event.accept()   self.button_creating()  else:  event.ignore()   def button_creating(self):  for elem in add_new:  counter = add_new.index(elem)  name = add_new_names[counter]  self.button = QPushButton(name)  self.button.setObjectName('button_'   str(name))  self.button.setFixedWidth(200)  self.button.setFixedHeight(200)  self.stacked_layout.addWidget(self.button)   self.mygroupbox.setLayout(self.stacked_layout)   self.scroll.setWidget(self.mygroupbox)   self.button.clicked.connect(self.clickevent)   def find_pdf(self, mimedata):  urls = list()  db = QMimeDatabase()  for url in mimedata.urls():  mimetype = db.mimeTypeForUrl(url)  if mimetype.name() == "application/pdf":  urls.append(url)  return urls   def clickevent(self):  print(self.button.text())  app = QApplication(sys.argv) demo = AppDemo() demo.showMaximized() sys.exit(app.exec_())  

Комментарии:

1. Предоставьте полный минимальный рабочий пример вашего кода, и я могу помочь

2. Я отредактировал вопрос, чтобы добавить больше кода

3. @monaghans_creed Создание новой группы кнопок при каждом изменении URL-адресов-странный подход. Было бы намного проще использовать виджет-список.

4. До сих пор я никогда не сталкивался с виджетом списка. Я понимаю вашу точку зрения, это намного проще! Спасибо!

Ответ №1:

Если я правильно понимаю, вы ищете функцию self.sender() .. С self.sender() вами доберетесь до кнопки, которая была нажата. особенно полезно, если у вас много кнопок, все они вызывают одну и ту же функцию, и вы хотите знать, какая кнопка была нажата. затем вы можете использовать pressed_btn = self.sender() и получать доступ ко всем функциям QPushButton . Здесь у меня есть пример, чтобы объяснить:

 from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout   class Example(QWidget):  def __init__(self):  super().__init__()   layout = QVBoxLayout()  self.setLayout(layout)  for i in range(10):  button = QPushButton(str(i), self)  button.setObjectName('button_'   str(i))  button.clicked.connect(self.test)  layout.addWidget(button)   def test(self):  button = self.sender()  print(f'Button Object name: {button.objectName()}nButton Text: {button.text()}')   if __name__ == '__main__':  app = QApplication([])  example = Example()  example.show()  app.exec()  

Вывод, когда я нажал кнопку 0: Когда я нажал кнопку 0