界面拉伸时的一些问题

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() 是布局在必须调整对象大小和布局时必须了解其行为的信息。

垂直 QSizePolicyPreferred,这意味着小部件可以缩小或增大到其尺寸提示的高度(建议的小部件首选尺寸)以下。

另一方面,默认情况下,按钮(包括 QRadioButton)和组合框具有 Fixed 垂直策略,这意味着它们不能垂直收缩,因为它们的大小提示将 始终受到尊重。

网格布局尝试遵守每行内所有小部件的垂直大小提示和策略(所有列的水平提示和策略也是如此)。
由于 Fixed 策略被认为更重要,布局将选择为具有按钮或组合的每一行遵守它,即使它还包含具有 Preferred 策略的小部件,并且由于大小标签的提示被认为足以正确显示它,它不会增长那一行。但是由于还有一行只有 Preferred 策略,它会让该行占据其他行留下的所有垂直 space。

为第一个标签设置 Fixed 策略将导致布局将 所有“行策略”固定为固定值,因此它会将它们均匀放置。

进一步说明

  • 设置 row/column 拉伸对于具有 FixedMaximum vertical/horizontal 策略的小部件的行无效;
  • 即使可行,您也在尝试设置行拉伸和最小高度 ,然后再 将任何小部件添加到布局(并且您也在尝试这样做使用 columnCount(),这显然是错误的):此时没有行,因此 for 循环将被忽略;
  • 网格布局的行列跨度始终默认为1,不需要指定;
  • 网格布局的行和列总是从 0 开始索引(几乎任何东西),您应该从行和列 0 开始添加小部件,而不是 1;
  • layout()是所有QWidgets已有的功能,最好避免覆盖;