В Qt, как я выравниваю элементы формы в разных группах?

Я пытаюсь создать стандартную двухколоночную форму, где первый столбец представляет собой текстовую метку (QLabel), а второй столбец - интерактивный виджет, обычно текстовое поле (QLineEdit). Мы решили разместить строки формы, которые разделяют общую тему внутри QGroupBox, и, следовательно, в отдельном макете, чем основной макет. Таким образом, элементы формы внутри каждого QGroupBox не выравниваются по горизонтали с элементами формы вне QGroupBox es.

Как я могу использовать групповые поля и макеты таким образом, чтобы QLabel и QLineEdit как внутри, так и вне групповых полей были (по горизонтали) совмещены друг с другом?

Спасибо!

Ответ 1

Вы можете установить свойство minimumWidth на всех ярлыках внутри групповых ящиков на нечто достаточно широкое, чтобы отображать самую широкую метку. Это приведет к выравниванию всех меток внутри разных групповых полей.

Теперь, чтобы получить метки вне групповых ящиков, выровненных с теми, что внутри: во-первых, я предполагаю, что каждая пара label/lineedit находится в своем собственном горизонтальном макете или что у вас есть несколько строк внутри сетки. В любом случае, вы можете установить минимальную ширину меток на то же значение, что и метки в групповых ящиках. Наконец, скорректируйте свойства layoutLeftMargin, layoutRightMargin и layoutSpacing в горизонтальной (или сетке) макете, пока правый и левый края пары label/lineedit не совпадут с теми, что находятся внутри групповых ящиков.

Если вы еще не используете редактор форм в Qt Creator или Qt Designer, чтобы создать свой пользовательский интерфейс, я нашел, что это облегчает задачу.

Я должен признать, что это чувствует себя немного kludgey, но в простой тестовый сценарий, который я построил, он, похоже, работал нормально. С другой стороны, это, вероятно, нарушится, если пользователь изменит размер шрифта. Может быть, есть лучший способ?

Надеюсь, что это поможет.

Ответ 2

Я не думаю, что он будет работать с наборами вложенных горизонтальных и вертикальных макетов. Вы считали QGridLayout?

Ответ 3

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 ) ;
}

Ответ 4

Используйте setGeometry(), чтобы заставить все ваши столбцы одинаковой ширины