Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ambrase от Январь 21, 2015, 22:07



Название: Компоновка виджетов внутри центрального виджета
Отправлено: ambrase от Январь 21, 2015, 22:07
  Есть QMainWindow, в котором есть скомпонованные таким вот образом отдельные виджеты, когда экран не растянут, то
выглядит так:
(http://i60.tinypic.com/qzghon.jpg)
когда растянут так:
(http://i62.tinypic.com/xoh5d0.jpg)

У MyWidget есть minSizeHint, который он в итоге и занимает по высоте, хотя спокойно растягивается по горизонтали.
Проблема в том, что почему-то черная область не накрывает зеленую.
Как это исправить?



 QWidget * centralView = new MyWidget;
    centralView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    QPalette Pal;
    Pal.setColor(QPalette::Background, Qt::black);
    QPalette PalYellow;
    PalYellow.setColor(QPalette::Background, Qt::yellow);
    QPalette PalGreen;
    PalGreen.setColor(QPalette::Background, Qt::green);
    centralView->setAutoFillBackground(true);
    centralView->setPalette(Pal);

    QWidget * data = new QWidget;
    data->setPalette(PalYellow);
    data->setAutoFillBackground(true);

    data->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    QPushButton * but = new QPushButton("Тест Кнопка");
    QVBoxLayout* phbxLayout = new QVBoxLayout;
    phbxLayout->addWidget(but,Qt::AlignTop);
    data->setLayout(phbxLayout);


    layout->addWidget(centralView, 0,0,Qt::AlignBottom);
    layout->addWidget(data, 1,0,Qt::AlignBottom);
    QWidget* empty = new QWidget;

    empty->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
    empty->setLayout(layout);
    empty->setPalette(PalGreen);
    empty->setAutoFillBackground(true);
    setCentralWidget(empty);


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: kambala от Январь 21, 2015, 23:55
попробуй черному задать QSizePolicy::Maximum по вертикали


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: ambrase от Январь 22, 2015, 06:37
Не помогло


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: Bepec от Январь 22, 2015, 11:09
Ответ - ошибка в настройках size policy.
Совет - выкладывайте проект с проблемой, мб я поиграюсь и вам настрою.


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: ambrase от Январь 22, 2015, 21:53
https://drive.google.com/file/d/0BwJmfE_cdZJ-NlAzU3VhMVdId0U/view?usp=sharing
Вот.

Я вообще чайник и честно говоря думал, что у меня ошибка именно в концепции как это надо было скомпоновывать средствами qt...


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: __Heaven__ от Январь 23, 2015, 09:40
Вот решение.
Код
C++ (Qt)
data->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);
Этот виджет грабастает себе пространство.


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: ambrase от Январь 23, 2015, 13:06
У меня там Minimum, попробовал поставить maximum - не помогло.


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: PimenS от Январь 23, 2015, 13:45
Скорее всего не нужно в layout->addWidget использовать выравнивание, или использовать его по другому.
Попробовал повторить код, но не нашел определения layout, использовал QVBoxLayout
Код:
QWidget *centralView = new QWidget;
    centralView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    QPalette Pal;
    Pal.setColor(QPalette::Background, Qt::black);
    QPalette PalYellow;
    PalYellow.setColor(QPalette::Background, Qt::yellow);
    QPalette PalGreen;
    PalGreen.setColor(QPalette::Background, Qt::green);
    centralView->setAutoFillBackground(true);
    centralView->setPalette(Pal);

    QWidget * data = new QWidget;
    data->setPalette(PalYellow);
    data->setAutoFillBackground(true);

    data->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    QPushButton * but = new QPushButton("Тест Кнопка");
    QVBoxLayout* phbxLayout = new QVBoxLayout;
    phbxLayout->addWidget(but);
    data->setLayout(phbxLayout);

    QVBoxLayout *layout = new QVBoxLayout;

    layout->addWidget(centralView);
    layout->addWidget(data);
    QWidget* empty = new QWidget;

    empty->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
    empty->setLayout(layout);
    empty->setPalette(PalGreen);
    empty->setAutoFillBackground(true);
    setCentralWidget(empty);

Попробуй так


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: __Heaven__ от Январь 23, 2015, 13:53
У меня там Minimum, попробовал поставить maximum - не помогло.
Да, забыл ещё написать
Код
C++ (Qt)
   layout->addWidget(centralView, 0,0);
   layout->addWidget(data, 1,0);
 


Название: Re: Компоновка виджетов внутри центрального виджета
Отправлено: ambrase от Январь 23, 2015, 20:10
Сделал-таки.
Надо было так:
 QGridLayout * layout = new QGridLayout;
    layout->addWidget(centralView, 0,0);
    layout->addWidget(data, 1,0, Qt::AlignBottom);

Короче говоря убрать один align из двух(только один!) и все будет как я хочу :)
Теперь растет только черное окно, зеленое  и желтое минимальны.