Причина такого поведения напрямую связана с тем, что виджет не добавляется в макет , а его содержимое добавляется после отображения.
Фактически, если вы вызываете centralWidget.SetData()
после инициализации и до mainWindow.show()
он будет работать как положено.
Многое происходит, когда вы добавляете дочерний виджет в макет, и это обычно включает в себя несколько вызовов дочерних подсказок размера, позволяя родителю адаптировать свою подсказку о размере, и, после этого , адаптировать его размер и размер его дочерних элементов.
Если этот «контейнерный виджет» сам содержится в другом макете, то размер виджета будет автоматически изменен (в зависимости от его подсказки) в следующем цикле событий, но в вашем случае этого не происходит, так как ваш - «бесплатный» виджет.
Функция, которую вы ищете, QWidget.adjustSize()
, но по вышеупомянутым причинам вы не можете вызвать его сразу после добавления дочерних виджетов.
Чтобы решить вашу проблему, вы можете позвонить QApplication.processEvents()
до adjustSize()
, или, в конце концов, используйте 0-основанный одиночный выстрел QTimer:
def SetData(self):
while self._layout.count() > 0:
widget = self._layout.takeAt(0).widget()
widget.hide()
widget.deleteLater()
for i in range(3):
self._layout.addWidget(QtWidgets.QLabel(str(MyWidget.z * 10 + i)))
MyWidget.z += 1
QtCore.QTimer.singleShot(0, self.adjustSize)