堆叠布局导致对齐到顶部问题
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
表示内容的大小提示将用作 最大大小 ,并且它不能大于那。
我有一个垂直布局,对齐方式设置为“顶部”,其中包含我想要的固定高度“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
表示内容的大小提示将用作 最大大小 ,并且它不能大于那。