2015-08-06 4 views
1

Я пытаюсь создать приложение на основе QQuickWidget.QT C++ сбой при вызове метода класса из другого класса с использованием сигналов и слотов

То, что я пытаюсь сделать:

класса А (game.h) и класс B (gamestate.h) предусмотрительны объявлены. Класс A является основным классом QQuickWidget с методами. Класс B QObject производный класс содержит сигналы, слоты, переменные и методы.

класса B Значения переменных можно установить с класса А - рабочий

Когда изменяется сигнал должен излучаться значение переменной - работа

, когда сигнал был излучаемый метод слот должен быть вызван в классе B - рабочий

Класс B должен вызвать метод в классе А - работа

класса А должны создать еще один qquickwidget - не работает (Ошибка компиляции. Сбой приложений при загрузке)

Я попытался вызвать функцию класса A и showIntro(), работающую нормально. Но когда пытался позвонить из класса B, он не работал.

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); 
} 

Вот мой 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(); 
} 

} 

и мой последний 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 предложить мне, что может быть проблемой.

ответ

2

Член переменной Game* game класса GameState не инициализирован, и поэтому программа вылетает при попытке разыменовать указатель в пределах GameState::stateChanged().

Измените конструктор GameState на следующее:

// 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))); 
} 
Смежные вопросы