2016-12-13 2 views
0

Когда приложение запускается, но все же во время построения (когда все начальный виджет создается и т. Д.), Я добавляю в свой макет QSplitter с двумя виджетами, и я хочу второй виджет занимает более или менее 60/70% доступного пространства, а первый виджет занимает остальную часть пространства (с учетом самого размера разделителя).Qt: QSplitter, redo размеры

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

splitter->setOrientation(Qt::Vertical); 
auto sizes = splitter->sizes(); 

int& first_w = sizes.front(); // == 0 
int& second_w = sizes.last(); // == 0 
int diff = form_w * 2.3 - tbl_w; (30% * 2.3 = ~70%) 

second_w += diff; 
first_w -= diff; 

splitter->setSizes(sizes); 

Но, first_w и second_w содержит 0 и 0, я не» t знать, если из-за того, что размеры еще не рассчитаны или потому, что виджет еще не показан (окна нет), а размеры невидимых виджетов - 0.

Что я могу сделать, чтобы получить «будущие» размеры этих виджетов? splitter находится внутри QVBoxLayout, а доступное пространство виджета владельца - это более или менее все вертикальное пространство окна (есть только QTabBar над виджетами, владеющим этим QVBoxLayout и немного дополнением в окне).

ответ

0

Согласно docs следующие должны делать правильные вещи ...

splitter->setSizes(QList<int>() << 30 << 70); 

Если QSplitter вертикальна, который должен распределить 30% до верхнего виджета и 70% к низшему.

+0

Нет, это не работает (у меня есть тест). Эти значения задают размеры в пикселях, которые я думаю, и поскольку между ними существует много свободного пространства, эти значения полностью заменяются 'sizeHint'. Видящий виджет - это 'QTextEdit', который находится внутри формы, которая занимает слишком много вертикального пространства. –

0

Способ QSplitter::sizes(), как представляется, дает ненулевые размеры только при отображении виджета. То, что я обычно делаю, чтобы обойти эту проблему, переопределяет QWidget::showEvent(QShowEvent *event) и вызывает метод QSplitter::setSizes().

+0

Правильно! Я не думал об этом. Но я думаю, что лучше было бы подключить слот к «показанному» сигналу, но, о! Нет никакого «показанного» сигнала! –

Смежные вопросы