Не меняется размер виджета под размер лейаута

Здравствуйте!

Есть такая проблема. Пытаюсь сделать машину состояний для приложения.

Машина состоит из основного виджета mainWindow, в котором лежит лейаут. В лейаут, при смене состояния, методом replaceWidget() вставляется новое окно с другим содержимым. По идее при этом автоматически размер окна должен подгоняться под размер лейаута, но этого не происходит. Всякие update() и adjustSize() ничего не меняют.

Если лейауту передать родителем mainWindow, ничего не меняется.

Если mainMenu передать родителем mainWindow, то он, почему-то вообще исчезает при применении реплейса. Если реплейс не применять, всё отображается как надо, это логично.

Можно, конечно, захардкодить размеры каждого окна, но мне кажется, что это можно сделать умнее и проще.

Вопросы такие:

1) Что вообще происходит с парентами и чайлдами, почему при назначении парента и реплейсе содержимое исчезает?

2) Как это исправить?

3) Возможно я не так подхожу к вопросу, если да, подскажите пожалуйста вариант лучше.

C++ (Qt)Выделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

StateMachine::StateMachine(QObject parent) : QObject(parent)
{
 
    mainWindow = new QWidget();
    layout = new QGridLayout();
    mainWindow->setLayout(layout);
    mainWindow->show();
 
 
    mainMenu = new MainMenu();
    layout->addWidget(mainMenu, 0, 0, 1, 1);
 
    qDebug() << "Запуск!";
 
    setState(MAIN_MENU);
}
 
void StateMachine::setState(ProgrammState state)
{
    switch(state)
    {
        case ProgrammState::MAIN_MENU:
            layout->replaceWidget(layout->itemAtPosition(0, 0)->widget(), mainMenu);
//            mainMenu = dynamic_cast<MainMenu>(w);
//            mainMenu->setParent(mainWindow);
//            mainWindow->adjustSize();
//            mainWindow->setFixedSize(mainWindow->size());
        break;
        case ProgrammState::GAME_SCREEN:
 
        break;
        case ProgrammState::VICTORY_SCREEN:
        break;
    }
}