Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: oxotnik от Июнь 26, 2009, 15:44



Название: Победить Layout в дизайнере
Отправлено: oxotnik от Июнь 26, 2009, 15:44
Имеется форма, кидаю на нее 2 QGroupBox, по высоте их растягиваю на всю форму, по ширине - таким образом, что ширина левого получатся ~1/2 ширины правого.
Выставляю форме горизонтальный Layout, в дизайнере все прекрасно - пропорции GroupBox-ов сохраняются
Запускаю форму - получаю одинаковую ширину GroupBox-ов.
В документации сказано:
Цитировать
Однажды задав логическое расположение, вы получаете следующие преимущества:
    * Позиционирование дочерних виджетов.
    * По умолчанию устанавливаются разумные размеры окон.
    * Разумные минимальные размеры окон.
    * Обработка изменения размеров.
    * Автоматическое обновление при смене следующих параметров содержимого:
как мне добится в рантайме, того что бы сохранились пропорции GroupBox-ов ?


Название: Re: Победить Layout в дизайнере
Отправлено: spectre71 от Июнь 26, 2009, 16:03
Имеется форма, кидаю на нее 2 QGroupBox, по высоте их растягиваю на всю форму, по ширине - таким образом, что ширина левого получатся ~1/2 ширины правого.
Выставляю форме горизонтальный Layout, в дизайнере все прекрасно - пропорции GroupBox-ов сохраняются
Запускаю форму - получаю одинаковую ширину GroupBox-ов.
В документации сказано:
Цитировать
Однажды задав логическое расположение, вы получаете следующие преимущества:
логическое расположение сначала надо задать! :)
Сначала кладешь Layout, а потом в него свои GroupBox, далее настраиваешь Layout на нужные пропорции.
Почитай доку по Layout. Посмотри примеры.


Название: Re: Победить Layout в дизайнере
Отправлено: oxotnik от Июнь 26, 2009, 16:20
логическое расположение сначала надо задать! :)
Сначала кладешь Layout, а потом в него свои GroupBox, далее настраиваешь Layout на нужные пропорции.
Почитай доку по Layout. Посмотри примеры.
Смотрел в примерах webkit\previewer\previewer.ui
там форме назначен горизонтальный Layout, и на самой форме лежат GroupBox-ы и разделены Splitter-ом (к стати, если на форму кинуть Layout то в нем спрлиттер не ставится)
делал по образу и подобию, однако в примерах работает, у меня никак  :-[


Название: Re: Победить Layout в дизайнере
Отправлено: lit-uriy от Июнь 26, 2009, 16:56
>>как мне добится в рантайме, того что бы сохранились пропорции GroupBox-ов ?
В рантайме всё будет также как и в дизайнере. Ни какой разницы.
Если получил разницу, значит делаешь не так как расказываешь, давай подробности в плоть до щелчков мыши (когда, и куда)

>>логическое расположение сначала надо задать!
>>Сначала кладешь Layout, а потом в него свои GroupBox, далее настраиваешь Layout на нужные пропорции.
Не надо так делать. Ты получшь лишний компоновщик.


Название: Re: Победить Layout в дизайнере
Отправлено: spectre71 от Июнь 26, 2009, 17:03
>>логическое расположение сначала надо задать!
>>Сначала кладешь Layout, а потом в него свои GroupBox, далее настраиваешь Layout на нужные пропорции.
Не надо так делать. Ты получшь лишний компоновщик.
Это смотря что он вообще хочет добиться.

UI  в студию!


Название: Re: Победить Layout в дизайнере
Отправлено: oxotnik от Июнь 26, 2009, 17:07
Создаю новый проект (форму)
Кидаю на форму 2 GroupBox
Делаю им размеры (какие хочу получить в пропорциях) мышкой растягиваю

Выделяю их (2 GroupBox)
Нажимаю на сплиттер (из 2 GroupBox получается маленькая синяя точка на форме)
Правой кнопкой на форме, в меню Layout=>Layout of Horizontaly (синяя точечка превращается в 2 GroupBox, расположенных как надо и растянутых в соответствии с пропорциями)
Все.
В дизайнере все прекрасно отображается
Запускаю - размеры одинаковые

Так в дизайнере получается:

|------------------|
|      |              |
|      |              |
|      |              |
|      |              |
|------------------|


Так в рантайме:

|-------------------|
|          |           |
|          |           |
|          |           |
|          |           |
|-------------------|


Название: Re: Победить Layout в дизайнере
Отправлено: oxotnik от Июнь 26, 2009, 17:08
UI  в студию!
XML или ui_...*h ?


Код
C++ (Qt)
       MainWindow->resize(746, 619);
       QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
       sizePolicy.setHorizontalStretch(0);
       sizePolicy.setVerticalStretch(0);
       sizePolicy.setHeightForWidth(MainWindow->sizePolicy().hasHeightForWidth());
       MainWindow->setSizePolicy(sizePolicy);
       centralWidget = new QWidget(MainWindow);
       centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
       horizontalLayout = new QHBoxLayout(centralWidget);
       horizontalLayout->setSpacing(6);
       horizontalLayout->setMargin(11);
       horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
       splitter = new QSplitter(centralWidget);
       splitter->setObjectName(QString::fromUtf8("splitter"));
       splitter->setOrientation(Qt::Horizontal);
       groupBox = new QGroupBox(splitter);
       groupBox->setObjectName(QString::fromUtf8("groupBox"));
       splitter->addWidget(groupBox);
       groupBox_2 = new QGroupBox(splitter);
       groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
       splitter->addWidget(groupBox_2);
 
       horizontalLayout->addWidget(splitter);
 
       MainWindow->setCentralWidget(centralWidget);
       menuBar = new QMenuBar(MainWindow);
       menuBar->setObjectName(QString::fromUtf8("menuBar"));
       menuBar->setGeometry(QRect(0, 0, 746, 19));
       MainWindow->setMenuBar(menuBar);
       statusBar = new QStatusBar(MainWindow);
       statusBar->setObjectName(QString::fromUtf8("statusBar"));
       MainWindow->setStatusBar(statusBar);


Название: Re: Победить Layout в дизайнере
Отправлено: spectre71 от Июнь 26, 2009, 17:45
1) Поскольку у тебя не заданы(каким-либо образом) пропорции для groupBox, то при изменении размеров окна они будут ресайзится пропорционально!

2) Это ОДНОЗНАЧНО прикол дизайнера!!! При запуске все правильно!

Дизайнер не может записать текущие положения разделителей, поскольку только программно, через setSizes, и естественно такого свойства не может быть, можно задать текущее положение разделителей!


Название: Re: Победить Layout в дизайнере
Отправлено: lit-uriy от Июнь 26, 2009, 19:37
>>Делаю им размеры (какие хочу получить в пропорциях) мышкой растягиваю
Если ты не задаёшь политику размеров, то это бесполезно, компоновщик будет управлять размерами.

>>Нажимаю на сплиттер (из 2 GroupBox получается маленькая синяя точка на форме)
Splitter - Разделитель - частный случай компоновщика. Ты не указал политику размера (как можно уменьшать), он и уменьшил до безобразия.


Название: Re: Победить Layout в дизайнере
Отправлено: lit-uriy от Июнь 26, 2009, 19:38
>>XML или ui_...*h ?
ui, он и есть XML. А c++ файл мы и сами из него получим.


Название: Re: Победить Layout в дизайнере
Отправлено: break от Июнь 26, 2009, 20:16
В вашем случае не подойдет жесткое задание ширины для одного из групп-боксов? - скажем для левого ставите maxWidth= XXX и он уже не растянегтся более чем XXX. Для правого ничего не ставите и он будет занимать оставшуюся часть - если я правильно понимаю то настраивая политики - там виджеты все равно будут стремиться к некоторому заранее заданному идеальному размеру.


Название: Re: Победить Layout в дизайнере
Отправлено: oxotnik от Июнь 26, 2009, 21:15
Так как можно в дизайнере (без ручного кодирования) сделать так, что бы один из виджетов по умолчанию был вдвое (втрое, и т.п. любой коэффициент ) уже другого (соседнего) виджета?
Как политики размеров настраивать?
ЗЫ: max...Size не подходит - в рантайме надо по разному их ресайзить.


Название: Re: Победить Layout в дизайнере
Отправлено: Авварон от Июнь 26, 2009, 22:01
grid layout?


Название: Re: Победить Layout в дизайнере
Отправлено: MoPDoBoPoT от Июнь 26, 2009, 22:35
Так как можно в дизайнере (без ручного кодирования) сделать так, что бы один из виджетов по умолчанию был вдвое (втрое, и т.п. любой коэффициент ) уже другого (соседнего) виджета?
Как политики размеров настраивать?
ЗЫ: max...Size не подходит - в рантайме надо по разному их ресайзить.

У компановщика есть свойство layoutStretch, в нем через запятую указываются факторы растяжки  идущих по порядку виджетов. Например, если у нас в горизонтальном компановщике 2 виджета и мы хотим достичь отношения 1:2, то надо просто в проперти написать 1,2


Название: Re: Победить Layout в дизайнере
Отправлено: VIMSVEI от Июль 02, 2009, 10:50
А у меня почему то у компановщика нет такого свойства  ???


Название: Re: Победить Layout в дизайнере
Отправлено: spectre71 от Июль 02, 2009, 11:20
А у меня почему то у компановщика нет такого свойства  ???
А какой у тебя компоновщик?


Название: Re: Победить Layout в дизайнере
Отправлено: MoPDoBoPoT от Июль 02, 2009, 12:00
А у меня почему то у компановщика нет такого свойства  ???
Во-первых это свойство появилось в Qt начиная с версии 4.5
Во-вторых это свойство у класса QBoxLayout и от него производных, соответственно.


Название: Re: Победить Layout в дизайнере
Отправлено: spectre71 от Июль 02, 2009, 12:15
Во-вторых это свойство у класса QBoxLayout и от него производных, соответственно.
Ты наверно имел ввиду у класса QBoxLayout и от него производных нет такого свойства.


Название: Re: Победить Layout в дизайнере
Отправлено: spectre71 от Июль 02, 2009, 12:54
Во-вторых это свойство у класса QBoxLayout и от него производных, соответственно.
Ты наверно имел ввиду у класса QBoxLayout и от него производных нет такого свойства.
Извиняюсь перепутал с QFormLayout!
Кстати у QGridLayout, тоже можно задавать  columnStretch, rowStretch