2015-08-06 5 views
1

J'essaie de créer une application basée sur QQuickWidget.QT C++ se bloque lors de l'appel de la méthode de classe d'une autre classe en utilisant des signaux et des emplacements

Ce que je suis en train de faire:

classe A (game.h) et classe B (gamestate.h) sont tournés vers l'déclarai. La classe A est la classe principale QQuickWidget avec des méthodes. La classe dérivée QObject de classe B contient des signaux, des slots, des variables et des méthodes.

classe B Les valeurs des variables peuvent définir de la classe A - travail

Lorsque valeur de la variable change de signal doit être émis - travail

lorsque la méthode de fente a été émis le signal devrait être appelé en classe B - travail

classe B doit invoquer une méthode dans la classe a - travail

classe a devrait créer un autre qquickwidget - PAS dE tRAVAIL (Aucune erreur de compilation. Application bloque sur la charge)

J'ai essayé d'appeler de la classe A et la fonction showIntro() fonctionne très bien. Mais quand essayé d'appeler de la classe B ne fonctionne pas.

Game.h

#ifndef GAME_H 
#define GAME_H 
#include <QQuickWidget> 
class GameState; 

class Game: public QQuickWidget 
{ 
Q_OBJECT 
public: 
    Game(); 
    GameState *gameState; 
    void showIntro(); 
public slots: 
    void onStatusChanged(QQuickWidget::Status); 
}; 

#endif // GAME_H 

Game.cpp

#include "game.h" 
#include <QQuickWidget> 
#include <QDebug> 
#include "gamestate.h" 

Game::Game(): QQuickWidget() 
{ 
    gameState = new GameState(this); 
    mainScreen = new QQuickWidget(); 
    connect(this, SIGNAL(statusChanged(QQuickWidget::Status)), this, SLOT(onStatusChanged(QQuickWidget::Status))); 

    setFixedSize(450, 710); 
    setSource(QUrl("qrc:/EmptyScreen.qml")); 

} 

void Game::onStatusChanged(QQuickWidget::Status status) 
{ 

switch(status) 
{ 
    case QQuickWidget::Ready: 
     qDebug() << "hi"; 
     gameState->setValue(1); 
     //showIntro(); 
     break; 
    case QQuickWidget::Error: 
     qDebug() << "Error"; 
     break; 
} 
} 
void Game::showIntro() 
{ 
    mainScreen->setSource(QUrl("qrc:/MainScreen.qml")); 
    mainScreen->setAttribute(Qt::WA_TranslucentBackground); 
    mainScreen->setParent(this); 
} 

Voici mon Gamestate.h

#ifndef GAMESTATE_H 
#define GAMESTATE_H 

#include <QObject> 


class Game; 


class GameState : public QObject 
{ 
Q_OBJECT 
public: 
    explicit GameState(QObject *parent = 0); 

    int value() const {return m_value; } 
    Game *game; 
signals: 
    void valueChanged(int newValue); 

public slots: 
    void setValue(int value); 
    void stateChanged(int value); 
private: 
    int m_value; 
}; 

#endif // GAMESTATE_H 

GameState.cpp

#include "gamestate.h" 
#include "game.h" 

GameState::GameState(QObject *parent) : QObject(parent) 
{ 
    m_value = 0; 
    connect(this,SIGNAL(valueChanged(int)), this, SLOT(stateChanged(int))); 
} 

void GameState::setValue(int value) 
{ 
    if(value != m_value) 
{ 
    m_value = value; 
    emit valueChanged(value); 
} 

} 

void GameState::stateChanged(int value) 
{ 
    if(value == 1) 
{ 
    game->showIntro(); 
} 

} 

et ma dernière main.cpp

#include <QApplication> 
#include <QQmlApplicationEngine> 
#include "game.h" 

Game *game; 

int main(int argc, char *argv[]) 
{ 
QApplication app(argc, argv); 

game = new Game(); 
game->show(); 
return app.exec(); 
} 

Pls me suggérer ce qui pourrait être la question.

Répondre

2

La variable membre Game* game de la classe GameState n'est pas initialisée et, par conséquent, le programme se bloque lorsque vous essayez de déréférencer le pointeur dans GameState::stateChanged().

Changer le constructeur de GameState à ce qui suit:

// in gamestate.h 
explicit GameState(Game *parent = 0); 

// in gamestate.cpp 
GameState::GameState(Game *parent) : QObject(parent), game(parent) 
{ 
    m_value = 0; 
    connect(this,SIGNAL(valueChanged(int)), this, SLOT(stateChanged(int))); 
}