Как предварительно просмотреть размеры виджетов в макете перед шоу ()? - PullRequest
16 голосов
/ 11 февраля 2011

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

Ответы [ 5 ]

9 голосов
/ 06 ноября 2011

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

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

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

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

8 голосов
/ 22 мая 2013

Для меня сработало следующее:

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

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

3 голосов
/ 11 февраля 2011

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

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

, и для

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

2 голосов
/ 17 февраля 2012

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

1 голос
/ 31 марта 2015

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

for(auto*child:widget->findChildren<QWidget*>()){child->updateGeometry();}
widget->updateGeometry();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...