我正在使用 PySide/PyQt,但这是一个通用的 Qt 问题。
有没有办法设置 QFormLayout 以便标签垂直居中而无需显式创建 QLabel 并将其垂直大小策略设置为先扩展?当第 2 列中的小部件高于我的标签时,我希望我的标签与小部件垂直居中,而不是与其顶部对齐...
这是一个演示该问题的示例脚本。我将标签涂成红色以更好地展示它们的尺寸行为。
from PySide import QtCore, QtGui
app = QtGui.QApplication([])
widget = QtGui.QWidget()
widget.setStyleSheet("QLabel { background-color : red}")
layout = QtGui.QFormLayout()
layout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
layout.setLabelAlignment(QtCore.Qt.AlignCenter)
editor1 = QtGui.QLineEdit()
editor1.setFixedSize(300, 100)
editor2 = QtGui.QLineEdit()
editor2.setFixedSize(300, 100)
layout.addRow('Input', editor1)
layout.addRow('Longer Named Input', editor2)
widget.setLayout(layout)
widget.show()
app.exec_()
结果如下:
这是一个示例,通过显式创建 QLabel 并为它们提供扩展大小策略来演示所需的结果:
from PySide import QtCore, QtGui
app = QtGui.QApplication([])
widget = QtGui.QWidget()
widget.setStyleSheet("QLabel { background-color : red}")
layout = QtGui.QFormLayout()
layout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
layout.setLabelAlignment(QtCore.Qt.AlignCenter)
editor1 = QtGui.QLineEdit()
editor1.setFixedSize(300, 100)
editor2 = QtGui.QLineEdit()
editor2.setFixedSize(300, 100)
label1 = QtGui.QLabel('Input')
expand = QtGui.QSizePolicy.Expanding
label1.setSizePolicy(expand, expand)
label2 = QtGui.QLabel('Longer Named Input')
label2.setSizePolicy(expand, expand)
layout.addRow(label1, editor1)
layout.addRow(label2, editor2)
widget.setLayout(layout)
widget.show()
app.exec_()
这就是结果......
我试过QFormLayout.setLabelAlignment()
似乎没有帮助。文档甚至提到 setLabelAlignment 仅对标签进行水平对齐(即使这样似乎也不会居中,只是向左或向右)。
顺便说一句,这导致我也尝试将水平对齐设置为居中,但事实证明这更加困难,因为标签不会水平扩展以填充空间(小标签不会扩展以匹配最大的标签)。我可以获得水平居中标签的唯一方法是在显示小部件后显式找到最大标签的宽度,然后将所有其他标签设置为具有相同的宽度......
labels = [layout.itemAt(i*2).widget() for i in range(layout.rowCount())]
max_width = max(label.width() for label in labels)
for w in labels:
w.setFixedWidth(max_width)
w.setAlignment(QtCore.Qt.AlignCenter)
结果是:
我在 QFormLayout 级别是否缺少任何将标签居中的内容?我是否必须制作 QLabels 并设置为扩展或事后打开扩展(如下所示)?感谢您的任何想法!
expand = QtGui.QSizePolicy.Expanding
labels = [layout.itemAt(i*2).widget() for i in range(layout.rowCount())]
for w in labels:
w.setSizePolicy(expand, expand)