Расчет макета виджета можно принудительно вызвать, вызвав invalidate()
, а затем activate()
в его макете, даже если виджет скрыт. Это также заставляет функции size()
и sizeHint()
виджета возвращать правильные и обновленные значения, даже если show()
еще не было вызвано для этого виджета.
Однако необходимо рекурсивно заботиться обо всех дочерних виджетах и макетах, поскольку запрос на пересчет макета не распространяется автоматически на дочерние элементы.
Следующий код показывает, как это сделать.
/**
* Forces the given widget to update, even if it's hidden.
*/
void forceUpdate(QWidget *widget) {
// Update all child widgets.
for (int i = 0; i < widget->children().size(); i++) {
QObject *child = widget->children()[i];
if (child->isWidgetType()) {
forceUpdate((QWidget *)child);
}
}
// Invalidate the layout of the widget.
if (widget->layout()) {
invalidateLayout(widget->layout());
}
}
/**
* Helper function for forceUpdate(). Not self-sufficient!
*/
void invalidateLayout(QLayout *layout) {
// Recompute the given layout and all its child layouts.
for (int i = 0; i < layout->count(); i++) {
QLayoutItem *item = layout->itemAt(i);
if (item->layout()) {
invalidateLayout(item->layout());
} else {
item->invalidate();
}
}
layout->invalidate();
layout->activate();
}