在Qt中,如何在不同的组框中对齐表单元素?

时间:2009-08-25 22:09:47

标签: qt layout qt4

我正在尝试创建标准的双列表单,其中第一列是文本标签(QLabel),第二列是交互式窗口小部件,通常是文本字段(QLineEdit )。我们已决定在QGroupBox内放置共享主题的表单行,因此在与主布局不同的布局中。因此,每个QGroupBox中的表单元素不会与QGroupBox之外的表单元素水平对齐。

如何以一种方式使用组框和布局,使得组内外的QLabelQLineEdit彼此(水平)对齐?

谢谢!

4 个答案:

答案 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()强制所有列的宽度相同