我正在尝试创建标准的双列表单,其中第一列是文本标签(QLabel
),第二列是交互式窗口小部件,通常是文本字段(QLineEdit
)。我们已决定在QGroupBox
内放置共享主题的表单行,因此在与主布局不同的布局中。因此,每个QGroupBox
中的表单元素不会与QGroupBox
之外的表单元素水平对齐。
如何以一种方式使用组框和布局,使得组内外的QLabel
和QLineEdit
彼此(水平)对齐?
谢谢!
答案 0 :(得分:4)
您可以将组框内所有标签上的minimumWidth属性设置为足以显示最宽标签的宽度。这将使不同组框内的所有标签对齐。
现在,要使组框之外的标签与内部标签对齐:首先,我假设每个标签/ lineedit对都在它自己的水平布局中,或者你在网格内有多行。在任何一种情况下,您可以执行的操作是将标签的minimumWidth设置为与组框中的标签相同的值。最后,调整水平(或网格)布局上的layoutLeftMargin,layoutRightMargin和layoutSpacing属性,直到label / lineedit对的右边缘和左边缘与组框内的边缘对齐。
如果你还没有在Qt Creator或Qt Designer中使用表格编辑器来构建你的UI,我发现它可以很容易地完成这项任务。
我不得不承认,这感觉有点笨拙,但在我建立的简单测试案例中,似乎工作正常。另一方面,如果用户更改字体大小,这似乎可能会中断。也许有更好的方法?
希望这有帮助。
答案 1 :(得分:1)
我认为它不适用于嵌套的水平和垂直布局。您考虑过QGridLayout吗?
答案 2 :(得分:1)
kenrogers提供了解决方案,以下是我用来使其工作的一些不完整的代码:
int width = 0 ;
QDialog* dialog ;
QList<QGridLayout*> layouts = dialog->findChildren<QGridLayout*>() ;
QList<QLabel*> labels ;
foreach ( QGridLayout* layout, layouts )
{
// Loop through each layout and get the label on column 0.
QLabel* foundLabel ;
labels << foundLabel ;
// Get the width.
width = qMax( foundLabel->width(), width ) ;
}
foreach ( QLabel* label, labels )
{
label->setMinimumWidth( width ) ;
}
答案 3 :(得分:0)
使用setGeometry()强制所有列的宽度相同