如何在 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)
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)