Python 当一个窗口小部件的可见性改变时,如何防止pyqt5应用程序中的窗口和窗口小部件改变大小

Python 当一个窗口小部件的可见性改变时,如何防止pyqt5应用程序中的窗口和窗口小部件改变大小,python,qt5,pyqt5,Python,Qt5,Pyqt5,我想创建一个对话框,在该对话框中,用户应首先在下拉列表中选择一项,并为某些选项指定一个附加参数。为了便于示例,假设可能的选择是A和B,对于B,用户必须输入文本。选择时,文本字段不应可见 这里是一个MWE: !/usr/bin/env python 导入系统 从PyQt5.QtWidgets导入QApplication、QComboBox、QDialog、QGridLayout、QLineEdit 类示例示例Qdialog: def u_init__self,父项=无: superQDialog,

我想创建一个对话框,在该对话框中,用户应首先在下拉列表中选择一项,并为某些选项指定一个附加参数。为了便于示例,假设可能的选择是A和B,对于B,用户必须输入文本。选择时,文本字段不应可见

这里是一个MWE:

!/usr/bin/env python 导入系统 从PyQt5.QtWidgets导入QApplication、QComboBox、QDialog、QGridLayout、QLineEdit 类示例示例Qdialog: def u_init__self,父项=无: superQDialog,self.\u初始化\u父级 self.mainLayout=QGridLayout self.setLayoutself.mainLayout self.comboBox=QComboBox self.comboBox.addItems['A','B'] self.mainLayout.addWidgetself.comboBox,0,0 self.lineEdit=QLineEdit self.lineEdit.setMinimumWidth50 self.mainLayout.addWidgetself.lineEdit,0,1 self.comboBox.activated[str].connectself.update self.updatesSelf.comboBox.currentText def updateself,选项: 如果选择“B”: self.lineEdit.setVisibleTrue 其他: self.lineEdit.setVisibleFalse 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplicationsys.argv 例 表演者 sys.exitapp.exec_ 问题是,当最初显示选项A时,对话框的大小刚好够组合框使用。当选择选项B时,窗口将展开,所有内容都将保持原样。但是,当再次选择选项A时,组合框的宽度会增加,占用所有可用空间,而不是在右侧留下空白

如何为文本字段分配空间,无论是否可见?我错过了什么

编辑S.Nick的答案以某种方式解决了MWE的问题,但不是我所希望的方式:一旦场景变得更复杂,小部件就会重新分配,例如,如果在组合框前面添加了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)

然后,在更改选择时,组合框将翻转。我想要的是,在开始时,为每个小部件分配空间和位置,并且无论任何小部件是否可见,空间和位置都是永久的。

您可以尝试以下方法:

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.setColumnStretch2,1将确保最后一列将占用所有额外的水平空间,即使行编辑小部件被隐藏

self.adjustSize将主窗口的大小调整为其所有子窗口小部件的大小之和。因为此时行编辑小部件仍然可见,所以在调整主窗口的大小时也会考虑其大小

截图

初始窗口:

选择B后: