Russian Qt Forum
Июнь 16, 2024, 04:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Widget не растягивается на весь экран  (Прочитано 14730 раз)
Dastes
Гость
« : Июнь 18, 2012, 19:09 »

Здравствуйте.
Если элементов мало, то Qscrollarea растягивается до требуемого размера. Если элементов поболее, то растягивается где-то до трети экрана, а дальше включается полоса перемотки.
Что сделать, что бы Qscrollarea/QGroupBox/QWidget растягивались на все свободное место на экране, вне зависимости от кол-ва элементов в QGridLayout?

Пробовал применять setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding), но не помогло.


Код:
    ilw= new QWidget;
    scrollArea = new QScrollArea;
    scrollArea->setFrameShape(QFrame::NoFrame);
    scrollArea->setWidgetResizable(true);
    gLayout = new QGridLayout;

    l22 = new QHBoxLayout;
    ilw->setLayout(gLayout);
    scrollArea->setWidget(ilw);
    l22->addWidget(scrollArea,1);

    IBListGroupBox->setLayout(l22);

    mainLayout->addWidget(IBListGroupBox, 1, Qt::AlignTop);

    setLayout(mainLayout);
« Последнее редактирование: Июнь 18, 2012, 20:51 от Dastes » Записан
Bepec
Гость
« Ответ #1 : Июнь 18, 2012, 19:25 »

вы у этого l22 параметры посмотрите. А самый лучший вариант - откройте дизайнер, попробуйте сделать то же самое в нём. Поиграйтесь с параметрами. А потом когда поймёте - пишите так.
Записан
Dastes
Гость
« Ответ #2 : Июнь 19, 2012, 20:55 »

Понял, только, что основная проблема в scroll area. Если прописать ей внушительную минимальную высоту, то растягивается отлично, а иначе занимает не более 200px на экране, хотя есть куда растягиваться.

Есть какие-нибудь идеи, что и где можно поменять?
Записан
Bepec
Гость
« Ответ #3 : Июнь 19, 2012, 21:05 »

Всё везде, исходя из вашего огрызка кода Веселый
Записан
shirushizo
Гость
« Ответ #4 : Июнь 20, 2012, 13:05 »

Указать необходимый stretch в этой строке
Код:
l22->addWidget(scrollArea,1);
вместо 1.

А лучше:
1. взять лист бумаги нарисовать _всю_ компоновку от руки;
2. продумать что и как будет изменять размеры, при изменении размера и/или пропорций окна;
3. проанализировать взаимное расположение элементов и принять решение о том, какие компоновщики нужны и что в них будет находиться;
4. продумать примерные значения параметров stretch, context margin, size policy, minimum/maximum width/height  и пр. для всех виджетов и компоновщиков
5. реализовать и отладить на компе

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

Удачи.

Записан
Dastes
Гость
« Ответ #5 : Июнь 20, 2012, 21:20 »

Уже отчаялся  Злой

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

http://zalil.ru/33479726
Записан
Bepec
Гость
« Ответ #6 : Июнь 20, 2012, 21:42 »

Слишком ты себя накрутил.

Совет - пользуйся дизайнером. Он проще, удобнее и БЫСТРЕЕ в отладке Подмигивающий

Твоя проблема в 1 строчке Веселый
вместо
Код:
       mainLayout->addWidget(IBListGroupBox, 1, Qt::AlignTop);

Код:
       mainLayout->addWidget(IBListGroupBox);

void QBoxLayout::addWidget ( QWidget * widget, int stretch = 0, Qt::Alignment alignment = 0 )
If the stretch factor is 0 and nothing else in the QBoxLayout has a stretch factor greater than zero, the space is distributed according to the QWidget:sizePolicy() of each widget that's involved.

The alignment is specified by alignment. The default alignment is 0, which means that the widget fills the entire cell.

PS читать надо внимательнее. И да - отладил большую часть гуи в дизайнере, потом хоть упишись в новом проекте, его описывая. А перед глазами будет пример Веселый
Записан
_OLEGator_
Гость
« Ответ #7 : Июнь 20, 2012, 21:45 »

to Bepec

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

а тут на лицо еще не умение пользоваться документацией...
Записан
Bepec
Гость
« Ответ #8 : Июнь 20, 2012, 21:52 »

Не. Поспорю - по примерам делать интерфейс ручками с самого начала - плохо. Очень плохо. Ибо примеры почти у всех, начиная от Бланша создаются динамически с многими оговорками.

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

А динамика выступает, уже в дальнейшем. Когда формы становятся динамическими, непостоянных размеров и нестандарных модификаций Улыбающийся

Когда ты ЗНАЕШЬ, чего хочешь. А не тыкаешься вслепую в коде.

PS да, дизайнер проще, но от простого к сложному - именно так шла эволюция Веселый
Записан
Dastes
Гость
« Ответ #9 : Июнь 20, 2012, 22:07 »

Bepec, благодарю.

Вспомнил зачем прописал выравнивание по верху. Когда слишком мало строк в таблице, то всю содержание группы находится по низу. Помню, что кроме этого не нашел решения, и как то не заметил, что это влияет на фактор растягивания.

Как сделать так, что бы содержание по верху было?
Записан
Bepec
Гость
« Ответ #10 : Июнь 20, 2012, 22:29 »

Spacer вставить вниз.
Записан
Dastes
Гость
« Ответ #11 : Июнь 21, 2012, 16:58 »

Bepec, добавил вниз спейсер. Работает, только когда размер окна по вертикали ~ 400px и менее, а если больше, то съезжает вниз.

Код:
    QSpacerItem* spacer = new QSpacerItem( 1, 1, QSizePolicy::Expanding,
    QSizePolicy::Expanding );
    l22->addSpacerItem(spacer);

В чем я ошибся?
Записан
Bepec
Гость
« Ответ #12 : Июнь 21, 2012, 17:43 »

Попробуй не указывать ему sizePolicy. Аля
Код:
 QSpacerItem* spacer = new QSpacerItem( 1, 1);
    l22->addSpacerItem(spacer);

PS я ещё раз повторюсь - лучше сначала всё делать в дизайнере. Когда разберёшься как работают политики, растяжение. Как реагируют поля и виджеты на это - вот тогда и начинай писать.

Записан
Dastes
Гость
« Ответ #13 : Июнь 21, 2012, 17:50 »

Попробуй не указывать ему sizePolicy. Аля
Код:
 QSpacerItem* spacer = new QSpacerItem( 1, 1);
    l22->addSpacerItem(spacer);

PS я ещё раз повторюсь - лучше сначала всё делать в дизайнере. Когда разберёшься как работают политики, растяжение. Как реагируют поля и виджеты на это - вот тогда и начинай писать.


Не работает. В дизайнере спейсер нарисовал, вроде нормально себя ведет.
Записан
Bepec
Гость
« Ответ #14 : Июнь 21, 2012, 17:59 »

Хз. Кода нет, что ты там сделал я незнаю.

PS намёк тонкий.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.062 секунд. Запросов: 20.