Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Dastes от Июнь 18, 2012, 19:09



Название: Widget не растягивается на весь экран
Отправлено: 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);


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 18, 2012, 19:25
вы у этого l22 параметры посмотрите. А самый лучший вариант - откройте дизайнер, попробуйте сделать то же самое в нём. Поиграйтесь с параметрами. А потом когда поймёте - пишите так.


Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 19, 2012, 20:55
Понял, только, что основная проблема в scroll area. Если прописать ей внушительную минимальную высоту, то растягивается отлично, а иначе занимает не более 200px на экране, хотя есть куда растягиваться.

Есть какие-нибудь идеи, что и где можно поменять?


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 19, 2012, 21:05
Всё везде, исходя из вашего огрызка кода :D


Название: Re: Widget не растягивается на весь экран
Отправлено: shirushizo от Июнь 20, 2012, 13:05
Указать необходимый stretch в этой строке
Код:
l22->addWidget(scrollArea,1);
вместо 1.

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

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

Удачи.



Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 20, 2012, 21:20
Уже отчаялся  >:(

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

http://zalil.ru/33479726 (http://zalil.ru/33479726)


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 20, 2012, 21:42
Слишком ты себя накрутил.

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

Твоя проблема в 1 строчке :D
вместо
Код:
       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 читать надо внимательнее. И да - отладил большую часть гуи в дизайнере, потом хоть упишись в новом проекте, его описывая. А перед глазами будет пример :D


Название: Re: Widget не растягивается на весь экран
Отправлено: _OLEGator_ от Июнь 20, 2012, 21:45
to Bepec

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

а тут на лицо еще не умение пользоваться документацией...


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 20, 2012, 21:52
Не. Поспорю - по примерам делать интерфейс ручками с самого начала - плохо. Очень плохо. Ибо примеры почти у всех, начиная от Бланша создаются динамически с многими оговорками.

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

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

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

PS да, дизайнер проще, но от простого к сложному - именно так шла эволюция :D


Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 20, 2012, 22:07
Bepec, благодарю.

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

Как сделать так, что бы содержание по верху было?


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 20, 2012, 22:29
Spacer вставить вниз.


Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 21, 2012, 16:58
Bepec, добавил вниз спейсер. Работает, только когда размер окна по вертикали ~ 400px и менее, а если больше, то съезжает вниз.

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

В чем я ошибся?


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 21, 2012, 17:43
Попробуй не указывать ему sizePolicy. Аля
Код:
 QSpacerItem* spacer = new QSpacerItem( 1, 1);
    l22->addSpacerItem(spacer);

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



Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 21, 2012, 17:50
Попробуй не указывать ему sizePolicy. Аля
Код:
 QSpacerItem* spacer = new QSpacerItem( 1, 1);
    l22->addSpacerItem(spacer);

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


Не работает. В дизайнере спейсер нарисовал, вроде нормально себя ведет.


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 21, 2012, 17:59
Хз. Кода нет, что ты там сделал я незнаю.

PS намёк тонкий.


Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 21, 2012, 18:08
Хз. Кода нет, что ты там сделал я незнаю.

PS намёк тонкий.

http://zalil.ru/33484316 (http://zalil.ru/33484316)


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 21, 2012, 19:16
Код:
QSpacerItem* spacer = new QSpacerItem( 20, 40);


Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 21, 2012, 19:22
Тоже не работает :(


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 21, 2012, 19:27
Код:
#include <QtGui>

#include "window.h"

Window::Window(QWidget *parent, int argc)
    : QWidget(parent)
{
    argcNumb=argc;

    QGroupBox * IBListGroupBox = new QGroupBox(tr("Информационные базы"));


    ilw= new QWidget;


  // ilw->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    scrollArea = new QScrollArea;
    //  scrollArea->setMinimumHeight(700);
   // scrollArea->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
 //   scrollArea->setFrameShape(QFrame::NoFrame);
   // scrollArea->setWidgetResizable(true);


    gLayout = new QGridLayout;

    QLabel * IBCapLabel = new QLabel(tr("<b>Наименование ИБ</b>"));
    QLabel * nameLabel = new QLabel(tr("<b>Логин</b>"));
    QLabel * pasLabel = new QLabel(tr("<b>Пароль</b>"));
    QLabel * statLabel = new QLabel("567");
    gLayout->addWidget(IBCapLabel, 0, 0);
    gLayout->addWidget(nameLabel, 0, 1);
    gLayout->addWidget(pasLabel, 0, 2);
    gLayout->addWidget(statLabel, 0, 3);//

    for(int i =1; i<10; i++)
    {


        labels[i] = new QCheckBox("name2");
        nameLineEdits[i] = new QLineEdit;
        pasLineEdits[i] = new QLineEdit;
        statusLabels[i]= new QLabel;

        labels[i]->setChecked(true);
        nameLineEdits[i]->setText("");
        pasLineEdits[i]->setText("");
        statusLabels[i]->setText("67");

        gLayout->addWidget(labels[i], i , 0);
        gLayout->addWidget(nameLineEdits[i], i , 1);
        gLayout->addWidget(pasLineEdits[i], i , 2);
        gLayout->addWidget(statusLabels[i], i , 3);

    }

    l22 = new QVBoxLayout;

    ilw->setLayout(gLayout);
    scrollArea->setWidget(ilw);
    l22->addWidget(scrollArea);
//    QSpacerItem* spacer = new QSpacerItem( 1, 1, QSizePolicy::Expanding,
//      QSizePolicy::Expanding );

     QSpacerItem* spacer = new QSpacerItem( 20, 40);

//scrollArea->adjustSize();
    //l22->addSpacerItem(spacer);
  //  l22->addStretch(3);

   // IBListGroupBox->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    IBListGroupBox->setLayout(l22);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    //QVBoxLayout *layout = new QVBoxLayout;


    mainLayout->addWidget(IBListGroupBox);


    setLayout(mainLayout);

    setWindowTitle(tr("1c backup"));
   resize(500, 575);

}


Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 21, 2012, 19:38
В этом варианте у scrollarea фиксированный размер, не растягивается по горизонтали.

Помоги пожалуйста добить до конца :)


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 21, 2012, 21:14
Бесит ) Всё бесит :D Код, названия переменных, куча указателей, цикл,игры с лейаутами. РРрРРРррРРррРРр...

Завтра посмотрю. Седни могу только завтраком накормить, иначе сорвусь.

НУ НЕЛЬЗЯ ЖЕ ТАК ПЕРЕМЕННЫЕ НАЗЫВАТЬ млиать!

Краткая история программы.

Жил да был argcNumb=argc; Был у него IBListGroupBox. Жил спокойно, поживал, строил свой истребитель ilw(Ил штурмовик будущего серии "W"). И растягивал он свой штурмовик. И туда, и сюда. Потом раз и подумал - надо же на него и scrollArea натянуть, чтобы враг его не замечал. И начал его тоже растягивать, рамки невидимыми делать. Тут раз - дождь. Ну что поделать - надо ангар сделать для ilw. И построил он сарай, и назвад его gLayout(прекрасное название). И много много мелких лейблов было. Все они были одинаковыми, отличались только именами. Тот Логин, тот Пароль, а тот вообще Наименование!!!

И начал он их в gLayout пихать. Да не все разом, а по одному. Первый раз сходил - запыхался. Подумал и цикл сделал. И начал всякие виджеты клепать полезные(видимо гаджеты к ИЛу) и по одному и начал их таскать. И ведь что главное - каждое имя их он запоминал и сохранял!

Но тут... Сгустились тучи, пошёл град, блеснули молнии и появился ОН! l22!
Втройне заторопился дед. Натянул по быстрому gLayout на ilw. А l22 всё ближе! Вышел дед на смертный бой, одолел супостата l22 и всунул ему в *ад почти готовую scrollArea. Да ещё и spacer сделал и туда же упихал!!!

Взвыл l22 и затих. А дед быстро быстро mainLayout создаёт, в него IBListGroupBox пихает, и всё это на Window вешает, надпись пишет похабную "1c backup" и ресайзит её до нужных кондиций.

Вот и cpp конец, а кто слушал молодец.



Название: Re: Widget не растягивается на весь экран
Отправлено: alexis031182 от Июнь 21, 2012, 21:18
Интересная реакция, эмоционально :)


Название: Re: Widget не растягивается на весь экран
Отправлено: Dastes от Июнь 21, 2012, 21:23
 :)
Не спорю, названия переменных далеки до идеала. Горбатого могила исправит >:(


Название: Re: Widget не растягивается на весь экран
Отправлено: Bepec от Июнь 21, 2012, 22:05
Секунда поэзии:

Могила расправляет скелет,
А человека то и нет :D

PS АРРРРРг * ушёл есть пингви пингви*