Когда приложение запущено, но еще во время создания (когда создается весь начальный виджет и т. Д.), Я добавляю в свой макет QSplitter
, с двумя виджетами, и я хочу, чтобы второй виджет занимал более или менее 60/70% доступного пространства, в то время как первый виджет занимает оставшееся пространство (принимая во внимание сам размер разделителя).
Итак, в начале, перед тем, как показывать само окно, я пытаюсь перенастроить эти два виджета примерно так:
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
, Я не знаю, потому что размеры еще не были рассчитаны, или потому что виджет еще не отображается (окно не отображается) и размеры виджетов невидимых 0
,
Что я могу сделать, чтобы получить «будущие» размеры этих виджетов? splitter
находится внутри QVBoxLayout
, а доступное пространство виджета владельца — это более или менее все вертикальное пространство окна (есть только QTabBar
выше виджета, владеющего этим QVBoxLayout
и немного отступов в окне).
Согласно документы следующее должно делать правильно …
splitter->setSizes(QList<int>() << 30 << 70);
Если QSplitter
вертикальный, который должен распределить 30% к верхнему виджету и 70% к нижнему.
Метод QSplitter::sizes()
кажется, дает ненулевые размеры только тогда, когда виджет отображается. То, что я обычно делаю, чтобы обойти эту проблему, переопределить QWidget::showEvent(QShowEvent *event)
и вызвать метод QSplitter::setSizes()
там.