Qt не обновляет геометрию без необходимости и не заставляет его это делать, и делает это по соображениям эффективности. Так что если setVisible(True)
или эквивалентный метод не вызывается, то геометрия не изменится.
Не вызывая setVisible (True), тогда размер пересчитывается, когда родительский виджет виден, и в этот момент виджет анализирует информацию QSizePolicy, QLayouts и др. c. В вашем конкретном случае тот, у которого есть предпочтение, имеет макет, и макет вычисляет размер на основе добавленных к нему виджетов, но в вашем случае у него нет добавленных виджетов, поэтому геометрия, рассчитанная макетом, равна 0x0, что делает его не видимый для нашего взгляда. Поэтому, если вы добавите виджеты в QGridLayout, вы не увидите этой проблемы.
Но если вы вызовете setVisible(True)
, геометрия вычисляется в этот момент, так как в этот момент нет макета, используется sizeHint , который по умолчанию равен 640x480 и поэтому виден. И когда макет установлен, размер контейнера равен максимуму предыдущего размера и размеру, предоставленному макетом.
Резюме:
почему виджет становится невидимым при назначении макета?
Если в виджете установлен макет, то размер виджета контейнера будет размером, определяемым виджетами, назначенными макету, что в вашем случае , так как их нет, размер равен 0x0.
Это какая-то ошибка или она так задумана?
Нет, это не ошибка, а ожидаемое поведение. Добавьте виджеты или установите размер для отображения окна.