【问题标题】:PyQt: How to connect automatically added buttonsPyQt:如何连接自动添加的按钮
【发布时间】:2021-12-11 17:56:19
【问题描述】:

我正在尝试编写的程序为列表中的每个元素添加一个按钮

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

【问题讨论】:

  • 提供您的代码的完整最小工作示例,我可以提供帮助
  • 我编辑了问题以添加更多代码
  • @monaghans_creed 每次 url 更改时创建一组新按钮是一种奇怪的方法。使用列表小部件会简单得多。
  • 直到现在我才发现列表小部件。我明白你的意思,它更容易!谢谢!

标签: python pyqt pyqt5


【解决方案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 时的输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2019-07-29
    • 2015-01-01
    相关资源
    最近更新 更多