<p>首先,了解Qt布局系统通过使用<em>布局项</em>(请参见<a href="https://doc.qt.io/qt-5/qlayoutitem.html" rel="nofollow noreferrer">QLayoutItem</a>)工作是很重要的,它们是用作对象的虚拟容器的抽象项:小部件、间隔符和布局(使用嵌套布局时)。实际上,每个QLayout都是QLayoutItem的一个子类</p>
<p>使用<code>setAlignment</code>表示设置指定布局项的对齐方式:</p>
<ul>
<li><code>layout.setAlignment(item, alignment)</code>设置<code>item</code>的对齐方式,<strong>将</strong>直接包含在<code>layout</code>中</李>
<li><code>layout.setAlignment(alignment)</code>设置与其父布局相关的<code>layout</code>的对齐方式;注意,这并不意味着<code>layout</code>内的项目将使用指定的对齐方式</李>
</ul>
<p>您的第二个案例<code>mainLayout.setAlignment(mainLayout, Qt.AlignTop)</code>不起作用并返回<code>False</code>,因为<code>mainLayout</code>显然不“包含”在<code>mainLayout</code>中。事实上,如果您仔细阅读文档,它会说:</p>
<blockquote>
<p>returns true if w/l is found in this layout (not including child layouts);</p>
</blockquote>
<p>在第三种情况下,您看不到任何结果,因为<code>mainLayout</code>是小部件的顶部布局,并且由于没有父布局,对齐<em>似乎被忽略。如上所述,使用<code>layout.setAlignment(alignment)</code>不会设置子项的对齐方式,而只设置<code>layout</code>的布局项的对齐方式。如果将该<code>mainLayout</code>添加到另一个布局中,您将看到布局</em>的对齐方式受到尊重</p>
<p>设置布局对齐很少被使用,这也是因为它通常是违反直觉的:人们可能会认为设置布局对齐将对齐其内容,但事实并非如此</p>
<P>阐明,考虑设置布局对齐与创建具有<EM> > EEM>布局的小部件几乎相同,并添加具有指定对齐方式的小部件。考虑到这一点,它更有意义:您不是在对齐小部件的内容,而是在对齐小部件本身</p>
<P>考虑下面的例子:除了左边的表(用于比较),我还通过指定它的对齐方式在左边添加一个布局,然后通过指定主布局的窗口小部件的对齐方式,在右边添加一个小部件。正如你所看到的,它们看起来完全一样</p>
<pre><code>from PyQt5 import QtCore, QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
test = QtWidgets.QWidget()
mainLayout = QtWidgets.QHBoxLayout(test)
# a very tall table to show the difference in alignment
mainLayout.addWidget(QtWidgets.QTableView(minimumHeight=300))
leftLayout = QtWidgets.QHBoxLayout()
# setting the alignment of leftLayout relative to mainLayout
leftLayout.setAlignment(QtCore.Qt.AlignTop)
leftLayout.addWidget(QtWidgets.QTableView(maximumHeight=100))
leftLayout.addWidget(QtWidgets.QPushButton())
mainLayout.addLayout(leftLayout)
rightWidget = QtWidgets.QWidget()
# adding the widget to mainLayout by aligning it on top as with leftLayout
mainLayout.addWidget(rightWidget, alignment=QtCore.Qt.AlignTop)
rightLayout = QtWidgets.QHBoxLayout(rightWidget)
rightLayout.addWidget(QtWidgets.QTableView(maximumHeight=100))
rightLayout.addWidget(QtWidgets.QPushButton())
test.show()
sys.exit(app.exec_())
</code></pre>
<p>最后,如果要对齐小部件,可以指定每个小部件的对齐方式,或者添加嵌套布局。<br/>
当许多小部件要以相同的对齐方式添加时,嵌套布局通常是最好的解决方案:在您的情况下,向主布局添加垂直布局,然后为按钮向垂直方向添加水平布局,并向垂直方向添加拉伸以“推”顶部的水平布局</p>
<p>或者,您可以使用网格布局并最终使用间隔符来确保小部件根据需要“对齐”</p>
<pre><code>from PyQt5 import QtCore, QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
test = QtWidgets.QWidget()
mainLayout = QtWidgets.QHBoxLayout(test)
class Button(QtWidgets.QPushButton):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setSizePolicy(
QtWidgets.QSizePolicy.Preferred,
QtWidgets.QSizePolicy.Preferred
)
noAlignGroup = QtWidgets.QGroupBox('no alignment')
mainLayout.addWidget(noAlignGroup)
noAlignLayout = QtWidgets.QHBoxLayout(noAlignGroup)
noAlignLayout.addWidget(QtWidgets.QTableView())
noAlignLayout.addWidget(Button())
noAlignLayout.addWidget(Button())
widgetAlignGroup = QtWidgets.QGroupBox('addWidget(widget, alignment)')
mainLayout.addWidget(widgetAlignGroup)
widgetAlignLayout = QtWidgets.QHBoxLayout(widgetAlignGroup)
widgetAlignLayout.addWidget(QtWidgets.QTableView())
widgetAlignLayout.addWidget(Button(), alignment=QtCore.Qt.AlignTop)
widgetAlignLayout.addWidget(Button(), alignment=QtCore.Qt.AlignTop)
layoutAlignGroup = QtWidgets.QGroupBox('nestedLayout.setAlignment()')
mainLayout.addWidget(layoutAlignGroup)
layoutAlignLayout = QtWidgets.QHBoxLayout(layoutAlignGroup)
layoutAlignLayout.addWidget(QtWidgets.QTableView())
buttonLayout = QtWidgets.QHBoxLayout()
layoutAlignLayout.addLayout(buttonLayout)
buttonLayout.setAlignment(QtCore.Qt.AlignTop)
buttonLayout.addWidget(Button())
buttonLayout.addWidget(Button())
stretchGroup = QtWidgets.QGroupBox('nestedLayout + stretch')
mainLayout.addWidget(stretchGroup)
stretchLayout = QtWidgets.QHBoxLayout(stretchGroup)
stretchLayout.addWidget(QtWidgets.QTableView())
rightLayout = QtWidgets.QVBoxLayout()
stretchLayout.addLayout(rightLayout)
buttonLayout = QtWidgets.QHBoxLayout()
rightLayout.addLayout(buttonLayout)
buttonLayout.addWidget(Button())
buttonLayout.addWidget(Button())
rightLayout.addStretch()
gridAlignGroup = QtWidgets.QGroupBox('grid + spacer')
mainLayout.addWidget(gridAlignGroup)
gridLayout = QtWidgets.QGridLayout(gridAlignGroup)
gridLayout.addWidget(QtWidgets.QTableView(), 0, 0, 2, 1)
gridLayout.addWidget(Button(), 0, 1)
gridLayout.addWidget(Button(), 0, 2)
spacer = QtWidgets.QSpacerItem(1, 50, vPolicy=QtWidgets.QSizePolicy.Expanding)
gridLayout.addItem(spacer, 1, 1)
test.show()
sys.exit(app.exec_())
</code></pre>