How to pass arguments to callback functions in PyQt

后端 未结 5 1510
臣服心动
臣服心动 2020-11-30 10:21

I have around 10 QAction (this number will vary in runtime) in a toolbar, which all will do same thing, but using different parameters. I am thinking to add parameter as an

5条回答
  •  我在风中等你
    2020-11-30 11:18

    The best way to pass the arguments is to not pass them at all. You can use the dynamic nature of python, and set whatever data you need as your own properties on the widgets themselves, get the target widget in the handler using self.sender(), and then get whatever properties you need directly from the widget.

    In this example five buttons are created and the required state is set on the button widget as my_own_data property:

    import sys
    from PyQt4 import QtGui, QtCore
    
    class Main(QtGui.QMainWindow):
    
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
            self.centralwidget = QtGui.QWidget()
            self.vboxlayout = QtGui.QVBoxLayout()
    
            for idx in range(5):
                button = QtGui.QPushButton('button ' + str(idx), None)
                button.my_own_data = str(idx)  # <<< set your own property
                button.clicked.connect(self.click_handler)  # <<< no args needed
                self.vboxlayout.addWidget(button)
    
            self.centralwidget.setLayout(self.vboxlayout)
            self.setCentralWidget(self.centralwidget)
            self.show()
    
        def click_handler(self, data=None):
            if not data:
                target = self.sender()  # <<< get the event target, i.e. the button widget
                data = target.my_own_data  # <<< get your own property
            QtGui.QMessageBox.information(self, 
                                          "you clicked me!", 
                                          "my index is {0}".format(data))
    
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()
    
    sys.exit(app.exec_())
    

提交回复
热议问题