Salut à vous !

La taille du message ci-dessous peut faire peur à lire, mais je vous promet que le code est extrêmement basique et que le problème doit être simple à résoudre, seulement je n'ai pas trop su faire le tri entre ce qui est vraiment essentiel et ce qui l'est moins. D'avance merci pour votre temps

Je ne suis pas totalement débutant avec Qt, et je connais le fonctionnement de base des widget, ainsi que la logique que suit Qt au niveau des évennements, signaux / slots etc. Je suis en train de réaliser un jeu de plateforme, en deux dimensions, avec une vue SFML pour le rendu, intégrée dans mon interface Qt. (J'ai pu lire que c'est souvent déconseillé, mais jusqu'ici je n'ai pas rencontré d'autres inconvénients, et j'ai besoin de tous les boutons / sliders / scrollArea et autres widgets que Qt me propose, en m'évitant d'avoir à les refaire en moins bien...)
Mon problème est alors le suivant: si je veux séparer les différents écrans de mon jeu, par exemple: un écran titre, puis un écran menu, puis un écran ou se déroule le jeu lui-même, comment fais-je ?
J'ai pensé à créer un nouveau widget personnalisé pour chaque écran, qui gère lui même les éléments qui le composent, par exemple:

editorscreen.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "screenwidget.h"
#include <QPushButton>
 
class EditorScreen : public ScreenWidget
{
public:
    EditorScreen(QWidget *parent = 0);
    ~EditorScreen();
    void UpdateScreen();
 
private:
    QPushButton* btn;
 
};
ScreenWidget (dont hérite EditorScreen) est une classe qui hérite de QWidget et qui sert de base à chaque écran-widget.

screenwidget.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
#include <QWidget>
 
class ScreenWidget : public QWidget
{
    Q_OBJECT
 
public:
    ScreenWidget(QWidget *parent = 0);
    ~ScreenWidget();
    virtual void UpdateScreen();
};
Ensuite, dans ma fenêtre principale (j'ai créé une nouvelle classe Application dérivée de QWidget), je crée un pointeur vers ScreenWidget, qui pointera vers l'écran actuel.

application.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <QWidget>
#include <QTimer>
#include "screenwidget.h"
#include "editorscreen.h"
#include "gamescreen.h"

class Application : public QWidget
{
    Q_OBJECT
public:
    Application(QWidget *parent = 0);
    ~Application();

public slots:
    void Loop();

private:
    QTimer timer;
    ScreenWidget* state;
};
application.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "application.h"

Application::Application(QWidget *parent) : QWidget(parent)
{
    timer.setInterval(16);
    connect(&timer,SIGNAL(timeout()),this,SLOT(Loop()));
    timer.start();

    state = new EditorScreen(this);
}

Application::~Application()
{
    delete state;
}

void Application::Loop()
{
    state->UpdateScreen();
}
Avec ce code, j'obtiens ma fenêtre principale, qui m'affiche correctement le contenu de EditorScreen. Si je fais la même chose avec "state = new GameScreen(this);", j'obtiens bien mon écran de jeu et tout fonctionne à merveille. Problème: je ne parviens pas à passer d'un écran à l'autre au cours de l'éxecution ! J'ai essayé, depuis un slot Application::Switch(), déclenché par un signal ScreenWidget::TriggerSwitch(), émis grâce un clic sur un bouton dans EditorScreen, de faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
delete state;
state = new GameScreen(this);
Mais j'obtiens une fenêtre vide, comme si la fenêtre principale restait mais que le GameScreen n'était pas créé !

Je m'y prends aussi peut-être mal, il y a surement autre chose prévu pour ça, j'ai regardé du côté de QStateMachine mais ça ne semble pas très adapté et j'ai du mal à comprendre son fonctionnement...
Enfin, j'attends vos suggestions avec impatiente !