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

时间:2019-08-17 11:10:46

标签: python qt5 pyqt5

我想创建一个对话框,用户首先应在其中选择一个项,然后为某些选择指定一个附加参数。出于示例的原因,我们假设可能的选择是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)

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

1 个答案:

答案 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()将主窗口的大小调整为其所有子窗口小部件的大小之和。由于此时行编辑窗口小部件仍然可见,因此在调整主窗口的大小时也会考虑其大小。

屏幕截图

初始窗口:

screenshot A

选择B后:

screenshot B