界面拉伸时的一些问题
Some problems when the interface is stretched
我在创建应用程序界面时,初始状态是我想要的,但是当我拉伸界面时,出现这种情况。
class AllSettingWindow(QWidget):
submit: QPushButton
cancel: QPushButton
result: pyqtSignal = pyqtSignal(dict)
def __init__(self):
super(AllSettingWindow, self).__init__()
self.setWindowTitle("Settings")
self.setMinimumSize(400, 200)
# layout
self.layout = QGridLayout()
self.layout.setObjectName("layout")
for i in range(1, self.layout.columnCount()):
self.layout.setRowMinimumHeight(i, 1)
self.layout.setRowStretch(i, 1)
self.theme_label = QLabel("theme")
self.theme_light = QRadioButton("light")
self.theme_dark = QRadioButton("dark")
self.theme_auto = QRadioButton("Auto")
self.font_label = QLabel("fonts")
self.font_box = QComboBox()
for i in range(10):
self.font_box.addItem(str(i))
self.font_size_label = QLabel("font-size")
self.font_size_box = QComboBox()
for i in range(64):
self.font_size_box.addItem(str(i))
self.submit = QPushButton("submit")
self.cancel = QPushButton("cancel")
self.layout.addWidget(self.theme_label, 1, 0, 1, 1)
self.themes = QButtonGroup()
self.layout.addWidget(self.theme_light, 2, 0, 1, 1)
self.layout.addWidget(self.theme_dark, 2, 1, 1, 1)
self.layout.addWidget(self.theme_auto, 3, 0, 1, 1)
self.layout.addWidget(self.font_label, 4, 0, 1, 1)
self.layout.addWidget(self.font_box, 4, 1, 1, 1)
self.layout.addWidget(self.font_size_label, 5, 0, 1, 1)
self.layout.addWidget(self.font_size_box, 5, 1, 1, 1)
self.layout.addWidget(self.submit, 6, 0, 1, 1)
self.layout.addWidget(self.cancel, 6, 1, 1, 1)
# self.layout.setRowStretch(0, 1)
# self.layout.setRowStretch(self.layout.rowCount(), 1)
self.setLayout(self.layout)
当我增加高度时,每行的控件都随着高度的增加而增加,第一行控件占了很多space,这不是我想要的结果,我想让它们展开等比例
初始
紧张
tl;博士
将标签的垂直策略设置为 Fixed
:
self.theme_label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
说明
小部件的 sizePolicy()
是布局在必须调整对象大小和布局时必须了解其行为的信息。
垂直 QSizePolicy 是 Preferred
,这意味着小部件可以缩小或增大到其尺寸提示的高度(建议的小部件首选尺寸)以下。
另一方面,默认情况下,按钮(包括 QRadioButton)和组合框具有 Fixed
垂直策略,这意味着它们不能垂直收缩,因为它们的大小提示将 始终受到尊重。
网格布局尝试遵守每行内所有小部件的垂直大小提示和策略(所有列的水平提示和策略也是如此)。
由于 Fixed
策略被认为更重要,布局将选择为具有按钮或组合的每一行遵守它,即使它还包含具有 Preferred
策略的小部件,并且由于大小标签的提示被认为足以正确显示它,它不会增长那一行。但是由于还有一行只有 Preferred
策略,它会让该行占据其他行留下的所有垂直 space。
为第一个标签设置 Fixed
策略将导致布局将 所有“行策略”固定为固定值,因此它会将它们均匀放置。
进一步说明
- 设置 row/column 拉伸对于具有
Fixed
或 Maximum
vertical/horizontal 策略的小部件的行无效;
- 即使可行,您也在尝试设置行拉伸和最小高度 ,然后再 将任何小部件添加到布局(并且您也在尝试这样做使用
columnCount()
,这显然是错误的):此时没有行,因此 for
循环将被忽略;
- 网格布局的行列跨度始终默认为1,不需要指定;
- 网格布局的行和列总是从 0 开始索引(几乎任何东西),您应该从行和列 0 开始添加小部件,而不是 1;
layout()
是所有QWidgets已有的功能,最好避免覆盖;
我在创建应用程序界面时,初始状态是我想要的,但是当我拉伸界面时,出现这种情况。
class AllSettingWindow(QWidget):
submit: QPushButton
cancel: QPushButton
result: pyqtSignal = pyqtSignal(dict)
def __init__(self):
super(AllSettingWindow, self).__init__()
self.setWindowTitle("Settings")
self.setMinimumSize(400, 200)
# layout
self.layout = QGridLayout()
self.layout.setObjectName("layout")
for i in range(1, self.layout.columnCount()):
self.layout.setRowMinimumHeight(i, 1)
self.layout.setRowStretch(i, 1)
self.theme_label = QLabel("theme")
self.theme_light = QRadioButton("light")
self.theme_dark = QRadioButton("dark")
self.theme_auto = QRadioButton("Auto")
self.font_label = QLabel("fonts")
self.font_box = QComboBox()
for i in range(10):
self.font_box.addItem(str(i))
self.font_size_label = QLabel("font-size")
self.font_size_box = QComboBox()
for i in range(64):
self.font_size_box.addItem(str(i))
self.submit = QPushButton("submit")
self.cancel = QPushButton("cancel")
self.layout.addWidget(self.theme_label, 1, 0, 1, 1)
self.themes = QButtonGroup()
self.layout.addWidget(self.theme_light, 2, 0, 1, 1)
self.layout.addWidget(self.theme_dark, 2, 1, 1, 1)
self.layout.addWidget(self.theme_auto, 3, 0, 1, 1)
self.layout.addWidget(self.font_label, 4, 0, 1, 1)
self.layout.addWidget(self.font_box, 4, 1, 1, 1)
self.layout.addWidget(self.font_size_label, 5, 0, 1, 1)
self.layout.addWidget(self.font_size_box, 5, 1, 1, 1)
self.layout.addWidget(self.submit, 6, 0, 1, 1)
self.layout.addWidget(self.cancel, 6, 1, 1, 1)
# self.layout.setRowStretch(0, 1)
# self.layout.setRowStretch(self.layout.rowCount(), 1)
self.setLayout(self.layout)
当我增加高度时,每行的控件都随着高度的增加而增加,第一行控件占了很多space,这不是我想要的结果,我想让它们展开等比例
初始
紧张
tl;博士
将标签的垂直策略设置为 Fixed
:
self.theme_label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
说明
小部件的 sizePolicy()
是布局在必须调整对象大小和布局时必须了解其行为的信息。
垂直 QSizePolicy 是 Preferred
,这意味着小部件可以缩小或增大到其尺寸提示的高度(建议的小部件首选尺寸)以下。
另一方面,默认情况下,按钮(包括 QRadioButton)和组合框具有 Fixed
垂直策略,这意味着它们不能垂直收缩,因为它们的大小提示将 始终受到尊重。
网格布局尝试遵守每行内所有小部件的垂直大小提示和策略(所有列的水平提示和策略也是如此)。
由于 Fixed
策略被认为更重要,布局将选择为具有按钮或组合的每一行遵守它,即使它还包含具有 Preferred
策略的小部件,并且由于大小标签的提示被认为足以正确显示它,它不会增长那一行。但是由于还有一行只有 Preferred
策略,它会让该行占据其他行留下的所有垂直 space。
为第一个标签设置 Fixed
策略将导致布局将 所有“行策略”固定为固定值,因此它会将它们均匀放置。
进一步说明
- 设置 row/column 拉伸对于具有
Fixed
或Maximum
vertical/horizontal 策略的小部件的行无效; - 即使可行,您也在尝试设置行拉伸和最小高度 ,然后再 将任何小部件添加到布局(并且您也在尝试这样做使用
columnCount()
,这显然是错误的):此时没有行,因此for
循环将被忽略; - 网格布局的行列跨度始终默认为1,不需要指定;
- 网格布局的行和列总是从 0 开始索引(几乎任何东西),您应该从行和列 0 开始添加小部件,而不是 1;
layout()
是所有QWidgets已有的功能,最好避免覆盖;