// ----------------------------GraphicsScene.h ---------------------------------//
class PlayState;
class GraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
GraphicsScene(int x, int y, int width, int height);
signals:
private slots:
protected:
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
private:
PlayState *playState;
QFinalState *final;
bool playing;
friend class PlayState;
};
// ----------------------------GraphicsScene.cpp 省略其它函数 ---------------------------------//
void GraphicsScene::keyPressEvent(QKeyEvent *event)
{
if(playing)
playState->keyPressEvent(event->key());
}
void GraphicsScene::keyReleaseEvent(QKeyEvent *event)
{
if(playing)
playState->keyReleaseEvent(event);
}
// ----------------------------GraphicsScene.h ---------------------------------//
class PlayState : public QState
{
Q_OBJECT
public:
PlayState(GraphicsScene *scene, QState *parent);
~PlayState();
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
public slots:
protected:
void onEntry(QEvent *);
void onExit(QEvent *);
private :
GraphicsScene *scene;
QStateMachine *machine;
QState *parallelChild;
KeyBall *keyballSpace;
};
// ----------------------------PlayState.cpp 省略其它函数 ---------------------------------//
void PlayState::keyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_Space:
{
keyballSpace->presse();
}
break;
default:
break;
}
}
void GraphicsScene::keyReleaseEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_Space:
{
keyballSpace->release();
}
break;
default:
break;
}
}
GraphicsScene可以直接重写keyPressEvent(QKeyEvent *event)和keyReleaseEvent(QKeyEvent *event)
我在GraphicsScene的keyPressEvent和keyReleaseEvent中调用PlayState中的keyPressEvent和keyReleaseEvent(PlayState中的keyPressEvent和keyReleaseEvent是自己定义的函数,父类没有这类函数),执行到keyballSpace->release()这句便出错,keyballSpace已new
想问下是否有人和我出现类似的情况,或者是否有更好的办法在QState中接收到事件?