如何在 PyQT5 中将复选框与按钮对齐?

How to align a check box with a button in PyQT5?

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.mainLayout = QFormLayout()
        check_box = QCheckBox()
        my_button = QPushButton("My button")
        my_button.setFont(QFont("Roboto", 18))
        self.mainLayout.addRow(check_box, my_button)
        self.setLayout(self.mainLayout)


app = QApplication(sys.argv)
mainWindow = Window()
mainWindow.show()
sys.exit(app.exec_())

复选框与按钮不一致。我怎样才能把它们排成一行? 它们都需要在 QFormLayout 上排成一行。

当将小部件设置为 QFormLayout 的“标签”时,对齐遵循默认行为,即在左上角对齐小部件(同时考虑大小策略)。

labelAlignment 属性 在这里无济于事,因为它只考虑 水平 对齐。

尝试手动设置用于“标签”小部件的布局项的对齐方式是不够的,因为 QFormLayout 以编程方式设置几何图形,并且“标签”始终顶部对齐。

要使小部件垂直居中,有两种可能性:

设置展开的纵向尺寸政策

默认情况下,QCheckBox 有一个 Fixed 垂直 sizePolicy,这意味着它将始终具有相同的高度,因此由于 QFormLayout 的默认行为,它将顶部对齐。

您可以更改小部件的垂直策略,然后它将垂直居中:

    check_box = QCheckBox()
    check_box.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)

重要提示:这仅适用于具有特定高度控件的小部件,如 QCheckBox 或 QRadioButton。为“可调整大小”的小部件(如 QComboBox)设置扩展的垂直策略将使该小部件占据整个可用高度。为避免这种情况,请使用以下解决方案。

创建容器

更合适的解决方案是为实际小部件创建一个容器,为该容器指定 expanding 垂直尺寸策略,设置基本框布局并添加复选框。

基本布局(QGridLayout、QBoxLayout)总是试图让它们的小部件占据它们布局“插槽”中所有可用的space,如果小部件有固定大小的策略,那么它将居中可用矩形。

    check_box = QCheckBox()
    check_container = QWidget()
    check_container.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
    check_layout = QVBoxLayout(check_container)
    check_layout.setContentsMargins(0, 0, 0, 0) # Important!
    check_layout.addWidget(check_box)
    my_button = QPushButton("My button")
    my_button.setFont(QFont("Roboto", 18))
    self.mainLayout.addRow(check_container, my_button)