Python 按下按钮时如何在QFormLayout中添加更多行

Python 按下按钮时如何在QFormLayout中添加更多行,python,user-interface,pyqt,pyside,pyside6,Python,User Interface,Pyqt,Pyside,Pyside6,我正在使用PySide6制作一个数据库编辑器。我制作了一个QPushButton,在QFormLayout中添加了两行。 看起来不错吧?这就是单击“添加另一列”之前的情况。 但是我点击了一下,并没有再做两行,而是把它们移到了最后 这是我的密码: def addTableForm(self): def addColumnForm(): layout.addRow(columnNameLabel, columnName) layout.addRow(col

我正在使用PySide6制作一个数据库编辑器。我制作了一个QPushButton,在QFormLayout中添加了两行。

看起来不错吧?这就是单击“添加另一列”之前的情况。 但是我点击了一下,并没有再做两行,而是把它们移到了最后

这是我的密码:

def addTableForm(self):
    def addColumnForm():
        layout.addRow(columnNameLabel, columnName)
        layout.addRow(columnTypeLabel, columnType)
    layout = QFormLayout(self)
    widget = QWidget(self)
    tableNameLabel = QLabel(parent=self, text="Enter the table name")
    tableName = QLineEdit(parent=self)
    columnNameLabel = QLabel(parent=self, text="Add a column")
    columnName = QLineEdit(parent=self)
    columnTypeLabel = QLabel(parent=self, text="Enter the type of the column")
    columnType = QLineEdit(parent=self)
    moreColumnsLabel = QLabel(parent=self, text="Add another column")
    moreColumns = QPushButton(parent=self, text="Add another column", clicked=addColumnForm)
    moreColumns.setFixedWidth(200)
    cancel = QPushButton(self, text="Cancel", clicked=self.selectTables)
    confirm = QPushButton(self, text="Confirm")
    layout.addRow(tableNameLabel, tableName)
    addColumnForm()
    layout.addRow(moreColumnsLabel, moreColumns)
    layout.addRow(cancel, confirm)
    widget.setLayout(layout)
    self.setCentralWidget(widget)
该函数位于一个MainWindow类中,继承了QMainWindow。 你能帮帮我吗?顺便问一下,你能给我一些造型技巧吗?我不喜欢所有小部件都挤在一起的方式

感谢

小部件是独特的实例,如果您再次尝试将它们添加到布局中,它们不会被“复制”。
事实上,您并没有添加新的小部件,您只是告诉布局使用给定的小部件添加一行,因为这些小部件已经在布局中,结果是它们被删除,并添加到“新”行中,从而导致它们发生移动

您需要的是动态创建新的小部件,并且由于您可能需要它们的内容,所以您应该保留它们的引用

一种可能的实施方式如下:

def addTableForm(self):
    columnWidgets = []
    def addColumnForm():
        columnName = QLineEdit()
        layout.addRow("Add a column", columnName)
        columnType = QLineEdit()
        layout.addRow("Enter the type of the column", columnType)
        columnWidgets.append((columnName, columnType))

    def getColumnData():
        return [(n.text(), t.text()) for n, t in columnWidgets]

    widget = QWidget()
    layout = QFormLayout(widget)
    tableName = QLineEdit()

    moreColumns = QPushButton(text="Add another column", clicked=addColumnForm)
    moreColumns.setFixedWidth(200)

    layout.addRow("Enter the table name", tableName)
    addColumnForm()
    layout.addRow("Add another column", moreColumns)

    cancel = QPushButton("Cancel", clicked=self.selectTables)
    confirm = QPushButton("Confirm")
    confirm.clicked.connect(lambda: self.createTable(tableName.text(), getColumnData()))

    layout.addRow(cancel, confirm)
    widget.setLayout(layout)
    self.setCentralWidget(widget)
一些注意事项:

  • 如果
    self
    是QMainWindow(不支持设置布局),则不应使用
    QFormLayout(self)
    ,因为QLayout构造函数的小部件参数是将在其上设置布局的小部件;您应该使用将用作中心小部件的小部件
  • 您不必总是为将要添加到布局中的小部件指定父部件:添加这些小部件的那一刻,父部件将自行拥有它们的所有权
  • 除非您需要设置特定的特性,否则不必为第一列创建QLabel,只需使用字符串
  • 如果QPushButton的第一个参数是字符串,则不需要使用关键字
感谢您的解决方案!它解决了我的大部分问题,但是新的小部件出现在“取消”和“确认”按钮下面。有没有办法解决这个问题?谢谢,我现在没法修好。在任何情况下,阅读答案和答案,你就会发现。