首页 > 解决方案 > 当一个小部件的可见性改变时,如何防止 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 时,对话框的大小对于组合框来说刚好足够。选择选项 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)

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

标签: pythonqt5pyqt5

解决方案


你可以尝试这样的事情:

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 后:

截图 B


推荐阅读