#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()