В 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(), чтобы заставить все ваши столбцы одинаковой ширины