代码之家  ›  专栏  ›  技术社区  ›  joey leavell

如何在元素中动态添加/删除元素?

  •  1
  • joey leavell  · 技术社区  · 8 年前

    这是我的密码。我试图使其在更改下拉框时,动态显示或多或少的QLineEdits以供输入。这只是测试的最新迭代

    import sys
    from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
        QInputDialog, QApplication, QComboBox, QFrame)
    
    import numpy as np
    
    
    class GUI(QWidget):
    
        def __init__(self):
            super().__init__()
    
            self.initgui()
    
        def initgui(self):
            #
            # Set up GUI 
            #
            self.setGeometry(100, 100, 400, 400)
            self.move(300, 300)
            combobox = QComboBox(self)
            for i in range(1, 10, 1):
                combobox.addItem(str(i + 1))
            combobox.activated[str].connect(self.comboboxchanged)
            self.setWindowTitle("Testing Easy Setup")
            self.show()
    
        def comboboxchanged(self, text):
            frame = QWidget(self)
            frame.hide()
            for num in range(0, int(text), 1):
                QLineEdit(frame).move(60, num * 19)
            frame.show()
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        gui = GUI()
        sys.exit(app.exec_())
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   eyllanesc    8 年前

    问题是,在您的情况下,当您将父对象传递给小部件时,它相对于父对象被放置在0,0位置 QFrame 位于 QComboBox 因为两者都处于0,0位置。正确的做法是使用布局。另一方面,在为其添加新的小部件之前,您必须删除这些小部件,我们创建了一个删除这些项目的函数。

    import sys
    from PyQt5.QtWidgets import *
    
    def clearLayout(lay):
        while lay.count() > 0:
            item = lay.takeAt(0)
            widget = item.widget()
            if widget:
                widget.deleteLater()
            del item
    
    
    class GUI(QWidget):
        def __init__(self):
            super().__init__()
            self.initgui()
    
        def initgui(self):
            lay = QHBoxLayout(self)
            vlay1 = QVBoxLayout()
            combobox = QComboBox(self)
            combobox.addItems([str(i) for i in range(2, 11)])
            vlay1.addWidget(combobox)
            vlay1.addItem(QSpacerItem(20, 245, QSizePolicy.Minimum, QSizePolicy.Expanding))
    
            self.vlay2 = QVBoxLayout()
            lay.addLayout(vlay1)
            lay.addLayout(self.vlay2)
            self.comboboxchanged(combobox.currentText())
            combobox.activated[str].connect(self.comboboxchanged)
            self.setWindowTitle("Testing Easy Setup")
            self.show()
    
        def comboboxchanged(self, text):
            clearLayout(self.vlay2)
            for num in range(0, int(text)):
                self.vlay2.addWidget(QLineEdit(self))
            self.vlay2.addItem(QSpacerItem(20, 245, QSizePolicy.Minimum, QSizePolicy.Expanding))
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        gui = GUI()
        sys.exit(app.exec_())