В Qt, как мне выровнять элементы формы в разных групповых полях? - PullRequest
11 голосов
/ 26 августа 2009

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

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

Спасибо!

Ответы [ 4 ]

4 голосов
/ 29 августа 2009

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

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

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

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

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

1 голос
/ 01 сентября 2009

Кенрогеры предоставили решение, и вот некоторый неполный код, который я использовал, чтобы заставить его работать:

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 ) ;
}
1 голос
/ 26 августа 2009

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

0 голосов
/ 26 августа 2009

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

...