堆叠布局导致对齐到顶部问题

Stacked Layout causing alignment to top problem

我有一个垂直布局,对齐方式设置为“顶部”,其中包含我想要的固定高度“header”条包含在 QHBoxLayout 中,下面有一个 QTextEdit window .此 header 栏的其中一个部分包含 QStackedLayout。如果您 运行 下面的示例代码,当调整 window 大小时,QTextEdit window 开始远离“header”栏,而不是停留在“[=] 下方13=]" 栏。预期的行为是 QTextEdit window 保持锚定在 header 栏下方并沿其底部边距扩展和收缩。如何修复 QStackedLayout 元素的大小以实现此行为?

from PySide2 import QtWidgets, QtCore, QtGui
from PySide2.QtWidgets import QApplication
import sys

class Demo(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Demo, self).__init__(parent)

        self.main_layout = QtWidgets.QVBoxLayout(self)
        self.main_layout.setAlignment(QtCore.Qt.AlignTop)

        # Header with combobox anchored to the top of the layout
        self.data_results_layout = QtWidgets.QHBoxLayout()
        self.results_stacked_layout = QtWidgets.QStackedLayout()
        self.data_results_layout.addLayout(self.results_stacked_layout)
        self.combobox_results_widget = QtWidgets.QWidget()
        self.combobox_results_widget.setFixedHeight(25)
        self.combobox_results_layout = QtWidgets.QVBoxLayout(self.combobox_results_widget)
        self.combobox_results_layout.setContentsMargins(0,0,0,0)
        self.directory_combobox = QtWidgets.QComboBox()
        self.directory_combobox.setFixedHeight(25)
        self.combobox_results_layout.addWidget(self.directory_combobox)
        self.results_stacked_layout.addWidget(self.combobox_results_widget)
        self.main_layout.addLayout(self.data_results_layout)

        # QTextEdit Window
        self.asset_data_layout = QtWidgets.QVBoxLayout()
        self.asset_data_window = QtWidgets.QTextEdit('Ready.')
        self.asset_data_layout.addWidget(self.asset_data_window)
        self.main_layout.addLayout(self.asset_data_layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())   

在布局上设置对齐方式不会设置其管理的小部件的对齐方式,但只有该布局会设置的对齐方式添加到 另一个 布局管理器时有(您可以在 中阅读更深入的解释)。

基本上如下:

layout.setAlignment(QtCore.Qt.AlignTop)

和这个差不多:

otherLayout.addLayout(layout, alignment=QtCore.Qt.AlignTop)

因此,不仅该对齐方式不会影响子对齐方式,而且由于您将该布局用作小部件的主要布局,因此该对齐方式将被完全忽略。

为了达到你想要的效果,你可以为下对齐设置一个拉伸(如 S.Nick 评论中所建议的):

self.main_layout.addLayout(self.asset_data_layout, stretch=1)

另一方面,考虑到 QStackedLayout 应该只用于自定义小部件或专用行为,在大多数情况下最好使用它的便利性 class QStackedWidget,您可以在其上设置合适的尺码政策:

    self.results_stacked_layout = QtWidgets.QStackedWidget()
    self.data_results_layout.addWidget(self.results_stacked_layout)
    self.results_stacked_layout.setSizePolicy(
        QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)

有了上面的内容,堆叠小部件将根据其内容水平调整自身大小,并且只会使用它所需的最小垂直 space:由于组合框尽可能水平扩展,它会尝试占用所有可用的水平space,并且由于组合框的垂直策略是固定的,它只会使用所需的垂直space,将所有剩余的垂直space留给其他小部件父布局。

请注意,大小策略定义可能看起来有点违反直觉;规则是它总是引用小部件的 sizeHint:Maximum 表示内容的大小提示将用作 最大大小 ,并且它不能大于那。