QSplitter с один фиксированный размер виджета и одной переменной размер виджета?

возможно ли иметь QSplitter, который имеет один виджет фиксированного размера, а другая-с переменным размером?

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

vSplitter = new QSplitter(Qt::Vertical, this);
vSplitter->addWidget(widget1);
vSplitter->addWidget(widget2);
QList<int> heights;
heights.push_back(550);
heights.push_back(1000);
vSplitter->setSizes(heights);

setCentralWidget(vSplitter);

спасибо.

2 ответов


попробуй это:

QSplitter::setStretchFactor ( int index, int stretch )

просто установите коэффициент растяжения части, которую вы хотите сохранить фиксированный размер 0 и установите его в 1 на другом виджете.

при изменении размера всего окна виджет с коэффициентом растяжения 0 не будет изменять размер.


Я пытаюсь сделать что-то подобное. У меня есть один фиксированный виджет (вверху) и один нефиксированный виджет (внизу). Я хочу, чтобы пользователь мог нормально использовать дескриптор splitter, но я не хочу, чтобы размер окна добавлял пространство в фиксированный виджет. Используя setSizePolicy на оба виджета не работает для меня, и не используя setStretchFactor на один или оба виджеты.

Я закончил подклассы QSplitter, чтобы я мог реализовать resizeEvent, который будет перемещать разделитель после размер сплиттера изменен. В этом коде предполагается: Есть только два виджета. Верхний [0] можно изменить, а нижний [1] - нет.

вот resizeEvent, который я написал:

MySplitter::resizeEvent(QResizeEvent *event) {
    /* The first resizeEvent is -1 for height and width, because it was
       invisible before. */
    if (event->oldSize().height() != -1) {
        int diff;
        QList<int> previousSizes = sizes();
        QSplitter::resizeEvent(event);
        QList<int> newSizes = sizes();
        /* The bottom widget is the fixed one, so find out if that is to
           grow or shrink. */
        diff = newSizes[1] - previousSizes[1];
        if (diff > 0) {
            /* Keep the bottom from growing by giving the size to the top. */
            newSizes[0] += diff;
            newSizes[1] -= diff;
        }
        else {
            /* Steal size from the top to keep it from shrinking. */
            newSizes[0] -= diff;
            newSizes[1] += diff;
        }
        setSizes(newSizes);
    }
    else
        QSplitter::resizeEvent(event);
}