Как просмотреть размеры виджетов в макете перед показом()?

Как я могу просмотреть, какой размер виджетов в окне будет после применения правил компоновки, до Я фактически show() окно виджета? Кажется, что все размеры 100x30 перед этой начальной командой show(). Как мне обойти это?

Ответы

Ответ 1

invalidate() работал у меня.

Обратите внимание, что если вы выполните следующее, это будет работать как задано здесь (по крайней мере, это похоже на мой код):

widget->show();
widget->layout()->invalidate();
widget->hide();

Это не отображает виджет на экране, так как вы не отказываетесь от управления обратно в очередь до тех пор, пока не произойдет hide(). В промежутке invalidate() вычисляет правильные позиции.

Ответ 2

Для меня работало:

window->layout()->update()
window->layout()->activate()

Это, вероятно, делает то же самое, что и ответ Алексиса, но для этого не требуется показ, а затем скрытие окна.

Ответ 3

Вы можете попробовать googling для "qt geometry before show", который показывает поток под названием "Настроить геометрию скрытого виджета" на форуме qtcentre.org, где вы можете прочитать ответ Wysota:

Вы можете вызвать invalidate() на раскладка. Он должен пересчитать себя тогда. Если нет, то есть эта тайна атрибут, который убеждает показывается, а затем вы должны быть способный заставить его пересчитывать. Но попробуйте другие вещи во-первых, это не что-то очень надежным.

и этот

Qt:: WA_WState_ExplicitShowHide установлен в true и Qt:: WA_WState_Hidden установлено в ложный. Обязательно верните значения (особенно второй) перед вами на самом деле показать виджет на экране.

Ответ 4

Используйте QWidget:: sizeHint, чтобы получить желаемый размер виджета верхнего уровня на основе размераHints всех дочерних виджетов и макетов. Или вызовите QWidget:: adjustSize, чтобы фактически запустить макет и изменить размер всего дерева виджетов. Обратите внимание, что adjustSize ограничивает окна верхнего уровня до 2/3 экрана, поэтому вы можете не получить то, что хотите для больших окон.

Ответ 5

Я попробовал различные решения, опубликованные другими (show & hide, update & activate, invalidate и WA_WState_ExplicitShowHide & WA_WState_Hidden), но ни один из них не был прав со всеми виджеты, которые мне приходилось центрировать, прежде чем называть show() в моем приложении. Я часами копался, и моя проблема заключалась в том, что неправильные размеры были кэшированы внутри QWidgetItemV2. Через несколько минут я придумал следующее:

for(auto*child:widget->findChildren<QWidget*>()){child->updateGeometry();}
widget->updateGeometry();