我想创建一个对话框,用户首先应在其中选择一个项,然后为某些选择指定一个附加参数。出于示例的原因,我们假设可能的选择是A和B,而对于B,用户必须输入文本。选择A时,文本字段应该不可见。
这是MWE:
#!/usr/bin/env python
import sys
from PyQt5.QtWidgets import QApplication, QComboBox, QDialog, QGridLayout, QLineEdit
class Example(QDialog) :
def __init__(self, parent=None) :
super(QDialog, self).__init__(parent)
self.mainLayout = QGridLayout()
self.setLayout(self.mainLayout)
self.comboBox = QComboBox()
self.comboBox.addItems(['A', 'B'])
self.mainLayout.addWidget(self.comboBox, 0, 0)
self.lineEdit = QLineEdit('')
self.lineEdit.setMinimumWidth(50)
self.mainLayout.addWidget(self.lineEdit, 0, 1)
self.comboBox.activated[str].connect(self.update)
self.update(str(self.comboBox.currentText()))
def update(self, choice) :
if 'B' in choice :
self.lineEdit.setVisible(True)
else :
self.lineEdit.setVisible(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
example = Example()
example.show()
sys.exit(app.exec_())
问题是,当最初显示选项A时,对话框的大小正好适合comboBox。当选择选项B时,窗口将被展开,一切都应保持原样。但是,再次选择选项A时,comboBox的宽度增加,占据了所有可用空间,而不是在右侧保留空白空间。
无论可见与否,如何为文本字段分配空间?我在这里想念什么?
编辑 S.Nick的回答以某种方式解决了MWE的问题,但不是我所希望的方式:解决方案越复杂,小部件就会再次重新分配,例如如果在comboBox前面添加了QLabel
self.label = QLabel('label')
self.mainLayout.addWidget(self.label, 0, 0)
self.comboBox = QComboBox()
self.comboBox.addItems(['A', 'B'])
self.mainLayout.addWidget(self.comboBox, 0, 1, alignment=Qt.AlignLeft)
self.lineEdit = QLineEdit('', self)
self.lineEdit.setMinimumWidth(50)
self.mainLayout.addWidget(self.lineEdit, 0, 2)
然后,更改选择时,组合框就会翻转。我想要的是,在开始时为每个小部件分配了空间和位置,并且无论是否可见任何小部件,该空间和位置都是永久的。
答案 0 :(得分:1)
您可以尝试这样的事情:
def __init__(self, parent=None) :
super(QDialog, self).__init__(parent)
self.mainLayout = QGridLayout()
self.setLayout(self.mainLayout)
self.label = QLabel('label')
self.mainLayout.addWidget(self.label, 0, 0)
self.comboBox = QComboBox()
self.comboBox.addItems(['A', 'B'])
self.mainLayout.addWidget(self.comboBox, 0, 1)
self.lineEdit = QLineEdit('', self)
self.lineEdit.setMinimumWidth(200)
self.mainLayout.addWidget(self.lineEdit, 0, 2)
self.comboBox.activated[str].connect(self.update)
self.mainLayout.setColumnStretch(2,1)
self.adjustSize()
self.update(str(self.comboBox.currentText()))
self.mainLayout.setColumnStretch(2,1)
将确保即使隐藏了行编辑小部件,最后一列也将占用所有多余的水平空间。
self.adjustSize()
将主窗口的大小调整为其所有子窗口小部件的大小之和。由于此时行编辑窗口小部件仍然可见,因此在调整主窗口的大小时也会考虑其大小。
屏幕截图
初始窗口:
选择B后: