Как изменить масштаб виджетов в макете? - PullRequest
1 голос
/ 29 сентября 2011

У меня есть виджет (давайте назовем его основным), который должен отображать еще два виджета.Я использую QGridLayout , чтобы расположить эти два виджета в основном виджете.(Это просто упрощено. У меня действительно есть 5 виджетов в главном окне)

Изначально эти два виджета имеют одинаковый размер, но они могут масштабироваться.Например, второй виджет должен отображаться в 2, 3 или 4 раза больше, чем первый виджет, но должны отображаться оба.

Примерно так:
enter image description here

Я пытался использовать addWidget , с растяжением 2-го виджета по строкам и столбцам, но это не сработало какожидается (размеры виджета остались прежними)

Итак, как бы вы предложили мне достичь в соответствии с просьбой?Если QGridLayout не тот класс, что я должен использовать?

РЕДАКТИРОВАТЬ:

Некоторые типы:
... struct info {int item;int row;столбец int;int rowSpan;int columnSpan;} typedef std :: vector LayoutDefinition;...

Класс WindowsContainer содержит это:

vector< QWidget* > containers;

Вот метод, который обновляет макет:

void WindowsContainer::SetNewLayout( const LayoutDefinition & newLayoutDef )
{
    // hide all containers
    for ( std::vector< QWidget* >::iterator it = containers.begin(); containers.end() != it; ++ it )
    {
        (*it)->hide();
    }

    // remove all items in the layout, and release the layout
    QLayout * currentLayout( layout() );
    if ( 0 != currentLayout )
    {
        // remove all items in the layout
        // (this code is taken from the reference page for the QLayout::takeAt() function)
        QLayoutItem *child;
        while ( ( child = currentLayout->takeAt( 0 ) ) != 0 )
        {
            delete child;
        }
    }
    delete( currentLayout );

    // form the new layout
    QGridLayout *newLayout = new QGridLayout( this );
    newLayout->setSpacing( 0 );
    newLayout->setContentsMargins( 0, 0, 0, 0 );

    for ( LayoutDefinition::const_iterator it = newLayoutDef.begin(); newLayoutDef.end() != it; ++ it )
    {
            QWidget * w( containers.at( it->item ) );

            newLayout->addWidget( w,
                                it->row,
                                it->column,
                                it->rowSpan,
                                it->columnSpan
                                );
            w->show();
    }

    // update the layout of this object
    setLayout( newLayout );
}

Все это работает, пока я не попытаюсьустановить rowSpan и columnSpan.Оба изображения по-прежнему занимают один и тот же размер области.

Я также пробовал с проставками, но это не сработало (не уверен, правильно ли я это сделал).

Ответы [ 3 ]

1 голос
/ 29 сентября 2011

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

enter image description here

«TopWidget» будет занимать столько места, сколько необходимо, как диктуется содержащимися в нем виджетами, а «BottomWidget» расширяется, занимая все оставшееся пространство при изменении размера окна приложения.

«BottomWidget» имеет политики горизонтального и вертикального размера, настроенные на «расширение».

0 голосов
/ 30 сентября 2011

Я понял, как это сделать: достаточно установить коэффициенты растяжения.

В приведенном выше примере:

for ( LayoutDefinition::const_iterator it = newLayoutDef.begin(); newLayoutDef.end() != it; ++ it )
    {
            QWidget * w( containers.at( it->item ) );

            newLayout->addWidget( w, it->row, it->column );
            w->show();
    }
    newLayout->setRowStretch( 0, 1 );
    newLayout->setRowStretch( 1, 2 );

Это приведет к тому, что 2-й ряд будет два разабольше, чем 1-й ряд.

0 голосов
/ 29 сентября 2011

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

...