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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Компоновка виджетов внутри центрального виджета  (Прочитано 5927 раз)
ambrase
Гость
« : Январь 21, 2015, 22:07 »

  Есть QMainWindow, в котором есть скомпонованные таким вот образом отдельные виджеты, когда экран не растянут, то
выглядит так:

когда растянут так:


У 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);
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Январь 21, 2015, 23:55 »

попробуй черному задать QSizePolicy::Maximum по вертикали
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ambrase
Гость
« Ответ #2 : Январь 22, 2015, 06:37 »

Не помогло
Записан
Bepec
Гость
« Ответ #3 : Январь 22, 2015, 11:09 »

Ответ - ошибка в настройках size policy.
Совет - выкладывайте проект с проблемой, мб я поиграюсь и вам настрою.
Записан
ambrase
Гость
« Ответ #4 : Январь 22, 2015, 21:53 »

https://drive.google.com/file/d/0BwJmfE_cdZJ-NlAzU3VhMVdId0U/view?usp=sharing
Вот.

Я вообще чайник и честно говоря думал, что у меня ошибка именно в концепции как это надо было скомпоновывать средствами qt...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Январь 23, 2015, 09:40 »

Вот решение.
Код
C++ (Qt)
data->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);
Этот виджет грабастает себе пространство.
Записан
ambrase
Гость
« Ответ #6 : Январь 23, 2015, 13:06 »

У меня там Minimum, попробовал поставить maximum - не помогло.
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #7 : Январь 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);

Попробуй так
« Последнее редактирование: Январь 23, 2015, 13:48 от PimenS » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Январь 23, 2015, 13:53 »

У меня там Minimum, попробовал поставить maximum - не помогло.
Да, забыл ещё написать
Код
C++ (Qt)
   layout->addWidget(centralView, 0,0);
   layout->addWidget(data, 1,0);
 
Записан
ambrase
Гость
« Ответ #9 : Январь 23, 2015, 20:10 »

Сделал-таки.
Надо было так:
 QGridLayout * layout = new QGridLayout;
    layout->addWidget(centralView, 0,0);
    layout->addWidget(data, 1,0, Qt::AlignBottom);

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

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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