Qt 基本布局总是尝试evenly将可用空间划分为其“单元格”,每个小部件都将保留该空间(即使它没有使用全部空间)。
请注意,不同的小部件类型也有不同的规模政策 https://doc.qt.io/qt-5/qsizepolicy.html#details告诉布局应该如何分配可用空间并最终设置这些小部件的几何形状。
例如,QLineEdit 有一个Fixed
纵向政策,这意味着它的大小提示将始终被视为唯一有效的高度(这类似于调用setFixedHeight()
or setFixedSize()
正如你所做的那样)。
相反,QLabel 有一个Preferred
大小策略,这意味着如果布局中还有剩余空间,它就可以利用它。
当您只有行编辑时,布局只有该小部件,因此它将把它放置在中心(因为您没有指定对齐方式)。但是当你添加标签时,布局发现行编辑需要非常小的空间,因此它将剩余的空间留给标签,因此你的结果。
对于像这样的简单情况,您可以在添加小部件时指定正确的对齐方式:提供对齐方式时,该项目不会尝试占据整个单元格,并且布局会将其与该布局单元格的可用空间对齐。
layout.addWidget(self.text, 0, 0, alignment=Qt.AlignBottom)
layout.addWidget(self.input, 1, 0, alignment=Qt.AlignTop)
请注意,我将该列更改为 0,因为将小部件放置在second如果第一列没有任何内容,unless你想利用setColumnStretch()
or setColumnMinimumWidth()
.
还要考虑到,对于这种带有大量空白空间的“宽”布局,通常最好使用嵌套布局或使用容器小部件。
例如:
layout = QGridLayout(self)
centerLayout = QVBoxLayout()
layout.addLayout(centerLayout, 0, 0, alignment=Qt.AlignCenter)
# ...
centerLayout.addWidget(self.text)
centerLayout.addWidget(self.input)
或者,另一种选择:
layout = QGridLayout(self)
centerWidget = QWidget()
layout.addWidget(centerWidget, 0, 0, alignment=Qt.AlignCenter)
centerLayout = QVBoxLayout(centerWidget)
# ... as above
尝试删除alignment
上面两个例子中的参数,你就会看到区别。
我建议你做一些实验Qt Designer 中的布局 https://doc.qt.io/qt-5/designer-layouts.html,这使得您可以更轻松地立即了解布局如何在不同的小部件类型中工作和表现。