gpt4 book ai didi

qt - 设置 QFormLayout QLabel 的垂直对齐方式

转载 作者:行者123 更新时间:2023-12-04 12:51:47 25 4
gpt4 key购买 nike

我正在使用 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_()

结果如下:

QFormLayout example with upper-left aligned labels

这是一个示例,通过显式创建 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 with vertically expanded labels

我试过 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)

结果是:

enter image description here

我在 QFormLayout 级别是否遗漏了任何将使标签居中的内容?我是否必须制作 QLabel 并设置为扩展或事后打开扩展(如下所示)?感谢您的任何想法!

expand = QtGui.QSizePolicy.Expanding
labels = [layout.itemAt(i*2).widget() for i in range(layout.rowCount())]
for w in labels:
w.setSizePolicy(expand, expand)

最佳答案

[2] 标签只能左对齐(默认)或右对齐”——我不相信这是真的。

您的代码不适合我运行,所以我无法测试您的确切代码。但是,此方法适用于其他小部件:请注意使用 | 来分隔各种位置命令。

label2.setAlignment(PyQt5.QtCore.Qt.AlignLeft|PyQt5.QtCore.Qt.AlignVCenter)

我知道这是几年前的事了,所以你可能想出了另一种方法,但这种方法对我来说效果很好。

关于qt - 设置 QFormLayout QLabel 的垂直对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34644808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com