Как в Qt выровнять элементы формы в разных групповых полях?

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

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

Спасибо!


person swongu    schedule 25.08.2009    source источник


Ответы (4)


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

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

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

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

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

person kenrogers    schedule 28.08.2009
comment
Я попробую - я дам вам знать, как это происходит. - person swongu; 31.08.2009
comment
Я не пробовал второй компонент, но могу сказать вам, что установка минимальной ширины меток внутри групповых полей верхнего уровня сработала волшебным образом. Смотрите мой собственный ответ для псевдокода. - person swongu; 01.09.2009

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

person KeyserSoze    schedule 25.08.2009
comment
Мне нужны элементы формы внутри разных групповых полей, поэтому, к сожалению, мне понадобятся разные/вложенные макеты. На самом деле я уже использую QGridLayout! - person swongu; 26.08.2009

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 ) ;
}
person swongu    schedule 01.09.2009

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

person PiedPiper    schedule 25.08.2009
comment
Не нарушит ли это политику компоновки? - person swongu; 26.08.2009