python - 按下按钮时如何在 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 类中。你能帮帮我吗?顺便问一下,你能不能也给我一些造型技巧?我不喜欢所有小部件挤在一起的方式。
谢谢
解决方案
小部件是唯一的实例,如果您尝试将它们再次添加到布局中,它们不会“重复”。
实际上,您并没有添加新的小部件,您只是告诉布局添加带有给定小部件的行,并且由于这些小部件已经在布局中,结果是它们被删除并添加到“新”行,这导致它们移动。
您需要动态创建新的小部件,并且由于您可能需要它们的内容,因此您应该保留它们的引用。
一个可能的实现可能如下:
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 的第一个参数是字符串,则不需要使用关键字;
推荐阅读
- reactjs - 如何观察 Redux 操作?
- reactjs - 从另一个类方法调用 React setState 不会更新集合
- php - 根据平均分数、评论数量和价格对产品进行排名
- python - 如何获取用户属于python中的哪个组
- redis - 为什么刚刚创建的redis集群used_memory_human是200M左右?
- python - 如果值无效,flask+marshmallow 设置默认值
- php - 在数据库codeigniter上保存时选择选项问题
- parsing - 从 url 解析 bibtex
- javascript - jest 无法使用主入口点定位模块
- tableau-api - 如何在 Tableau 计算中排除不适用的值