首页 > 解决方案 > 按下按钮时如何在 QFormLayout 中添加更多行

问题描述

我正在使用 PySide6 制作数据库编辑器。我制作了一个 QPushButton 在 QFormLayout 中添加 2 行。 见截图 1

看起来不错吧?这就是单击“添加另一列”之前的样子。但是然后我单击,而不是再制作 2 行,而是将它们移动到最后 查看屏幕截图 2

这是我的代码:

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)

该函数位于 QMainWindow 的继承者 MainWindow 类中。你能帮帮我吗?顺便问一下,你能不能也给我一些造型技巧?我不喜欢所有小部件挤在一起的方式。

谢谢

标签: pythonuser-interfacepyqtpysidepyside6

解决方案


小部件是唯一的实例,如果您尝试将它们再次添加到布局中,它们不会“重复”。
实际上,您并没有添加新的小部件,您只是告诉布局添加带有给定小部件的行,并且由于这些小部件已经在布局中,结果是它们被删除并添加到“新”行,这导致它们移动。

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

一个可能的实现可能如下:

def addTableForm(self):
    columnWidgets = []
    def addColumnForm():
        row = layout.rowCount()
        columnName = QLineEdit()
        layout.insertRow(row, "Add a column", columnName)
        columnType = QLineEdit()
        layout.insertRow(row + 1, "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)

一些注意事项:

  • 你不应该使用QFormLayout(self)ifself是 QMainWindow (它不支持设置布局),因为 QLayout 构造函数的 widget 参数是要设置布局的小部件;您应该使用将用作中心小部件的小部件;
  • 您不需要总是为要添加到布局中的小部件指定父级:添加这些小部件的那一刻,父级将自行取得其所有权;
  • 除非您需要设置特定功能,否则无需为第一列创建 QLabels,只需使用字符串即可;
  • 如果 QPushButton 的第一个参数是字符串,则不需要使用关键字;

推荐阅读