Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 设置QFormLayout QLabel的垂直对齐_Qt_Pyqt_Alignment_Pyside_Qlayout - Fatal编程技术网

Qt 设置QFormLayout QLabel的垂直对齐

Qt 设置QFormLayout QLabel的垂直对齐,qt,pyqt,alignment,pyside,qlayout,Qt,Pyqt,Alignment,Pyside,Qlayout,我使用的是PySide/PyQt,但这是一个一般的Qt问题 有没有一种方法可以设置QFormLayout,这样标签就可以垂直居中,而不必显式创建QLabel并将其垂直大小策略设置为先扩展?当第2列中的小部件比我的标签高时,我希望我的标签与小部件垂直居中,而不是与它的顶部对齐 下面是一个演示问题的示例脚本。我已将标签涂成红色,以更好地显示其尺寸行为 from PySide import QtCore, QtGui app = QtGui.QApplication([]) widget = Qt

我使用的是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级别,我是否缺少将标签居中的任何内容?我必须创建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)

我认为你的问题没有一个优雅的解决办法。 发件人:

void QFormLayoutPrivate::arrangeWidgets(常量QVector和布局、QRect和rect)
{
// [...]
如果(标签){
int height=layouts.at(标签->索引).size;
如果((标签->展开方向()&Qt::垂直)==0){
/*
如果右边的场地很高,
我们希望标签顶部对齐,但不要太多
很多,所以我们引入了7/4因子
在顶部获取一些额外的像素。
*/
高度=qMin(高度,
qMin(标签->尺寸int.height()*7/4,
标签->maxSize.height());
}
[1] QSize sz(qMin(标签->布局宽度,标签->大小点宽度()),高度);
int x=leftOffset+rect.x()+标签->布局位置;
[2] if(固定对齐(q->labelAlignment(),layoutDirection)&Qt::AlignRight)
[]x+=标签->布局宽度-sz.width();
[]点p(x,layouts.at(标签->vLayoutIndex.pos);
//##################扩展和
标签->集合几何(QStyle::visualRect(布局方向、rect、QRect(p、sz));
}
// [...]
}
我们在这里看到了什么

  • [1] 标签不会水平拉伸
  • [2] 标签只能左对齐(默认情况下)或右对齐
因此,您必须以某种方式手动同步标签的宽度(例如,设置固定宽度),或者放弃
QFormLayout
而改用
QGridLayout

“[2]标签只能左对齐(默认情况下)或右对齐”-我不相信这是真的

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

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

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

太棒了!谢谢你对这种行为的解释!在Python子类中重写该方法有效吗?它是私人的吗?不过,尝试重写该方法肯定比仅使用QGridLayout更麻烦,因此我认为这是阻力最小的路径。@7不,无法重写该方法。我明天将对此进行测试。问题在于QFormLayout在标签布局方面有一组自以为是的限制,它在内部处理这些限制。我认为您显示的行为对于QGridLayout中手动创建的标签来说非常有意义。当高级便利功能(QFormLayout)不能提供您想要的选项时,这可能只是一个需要放下抽象层(到QGridLayout)的典型案例。谢谢你的建议!我的代码仍然有效,因此改进对我仍然有用。没问题,我希望这最终能为您解决问题。这应该是公认的答案。目前公认的答案是错误的。
label2.setAlignment(PyQt5.QtCore.Qt.AlignLeft|PyQt5.QtCore.Qt.AlignVCenter)