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);
}