Qt: QSplitter, повтор размеров

Когда приложение запущено, но еще находится во время разработки (когда все исходные виджеты создаются и т. д.), я добавляю в свой макет 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, и немного отступа в окне).


person Peregring-lk    schedule 13.12.2016    source источник


Ответы (2)


Согласно документам, следующее должно работать правильно...

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

Если QSplitter расположен вертикально, 30 % приходится на верхний виджет, а 70 % — на нижний.

person G.M.    schedule 13.12.2016
comment
Нет, не работает (проверил). Я думаю, что эти значения задают размеры в пикселях, и, поскольку между ними есть много свободного места, эти значения полностью заменяются sizeHints. Оскорбительный виджет — это QTextEdit внутри формы, который занимает слишком много места по вертикали. - person Peregring-lk; 13.12.2016

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

person piarston    schedule 14.12.2016
comment
Верно!! Я не думал об этом. Но я думаю, что было бы лучше подключить слот к сигналу shown, но, о!! Сигнала shown нет! - person Peregring-lk; 14.12.2016