dynamically adding and removing widgets in PyQt

前端 未结 3 666
无人及你
无人及你 2020-12-07 23:53

using PyQt, I am trying to create an interface for which I can add or remove widget dynamically. I want to define a separate class for the widget that will be added or remov

3条回答
  •  太阳男子
    2020-12-08 00:12

    Here is a little change that will make the button delete itself once clicked:

    from PyQt4 import QtGui, QtCore
    import sys
    
    class Main(QtGui.QMainWindow):
        def __init__(self, parent = None):
            super(Main, self).__init__(parent)
    
            # main button
            self.addButton = QtGui.QPushButton('button to add other widgets')
            self.addButton.clicked.connect(self.addWidget)
    
            # scroll area widget contents - layout
            self.scrollLayout = QtGui.QFormLayout()
    
            # scroll area widget contents
            self.scrollWidget = QtGui.QWidget()
            self.scrollWidget.setLayout(self.scrollLayout)
    
            # scroll area
            self.scrollArea = QtGui.QScrollArea()
            self.scrollArea.setWidgetResizable(True)
            self.scrollArea.setWidget(self.scrollWidget)
    
            # main layout
            self.mainLayout = QtGui.QVBoxLayout()
    
            # add all main to the main vLayout
            self.mainLayout.addWidget(self.addButton)
            self.mainLayout.addWidget(self.scrollArea)
    
            # central widget
            self.centralWidget = QtGui.QWidget()
            self.centralWidget.setLayout(self.mainLayout)
    
            # set central widget
            self.setCentralWidget(self.centralWidget)
    
        def addWidget(self):
            self.scrollLayout.addRow(TestButton()) 
    
    
    class TestButton(QtGui.QPushButton):
      def __init__( self, parent=None):
          super(TestButton, self).__init__(parent)
          self.setText("I am in Test widget")
          self.clicked.connect(self.deleteLater)
    
    
    app = QtGui.QApplication(sys.argv)
    myWidget = Main()
    myWidget.show()
    app.exec_()
    

    This way it shouldn't mem leak when deleted and the button can actually be used for stuff. I follow this pattern for progress bars by the dozens for downloads and chunks monitoring and it works just fine even with threading and multi processing. And not the easy QThreads...

提交回复
热议问题