python - 当一个小部件的可见性改变时,如何防止 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)
然后在更改选择时翻转组合框。我想要的是,一旦在开始时为每个小部件分配空间和位置,并且无论任何小部件是否可见,空间和位置都是永久的。
解决方案
你可以尝试这样的事情:
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 后:
推荐阅读
- c# - 是否有更快的方法来使用 Selenium C# 填充输入表单
- cron - cron 作业错误:“找不到 sqoop 命令”
- javascript - .attr() 或 .prop() 或 replaceWith 不影响 iOS 中的 href?
- oracle - Oracle 确定性要求和特性
- c# - 在实体框架中使用关联表创建一对多
- javascript - 如何使用Javascript中的文件夹中的文件名将数组写入TXT文件
- python - python.logging:为什么我的 non-basicConfig 设置不起作用?
- apache-spark - 如何在 spark-shell 运行时添加罐子?
- design-patterns - 构图与立面模式
- php - Laravel 按查询字符串过滤