Как просмотреть размеры виджетов в макете перед показом()?
Как я могу просмотреть, какой размер виджетов в окне будет после применения правил компоновки, до Я фактически 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();