• 5280阅读
  • 1回复

Qt状态机QState如何接收QKeyEvent? [复制链接]

上一主题 下一主题
离线落叶歸根
 
只看楼主 倒序阅读 楼主  发表于: 2012-06-04
// ----------------------------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中接收到事件
离线xianzhi
只看该作者 1楼 发表于: 2012-06-04
恩。。学习一下
先知www.xianzhi.net先知www.xianzhi.net
先知www.xianzhi.net先知www.xianzhi.net
先知设计www.xianzhi.net先知设计www.xianzhi.net
先知设计www.xianzhi.net先知设计www.xianzhi.net
思翰www.sihan.net思翰www.sihan.net
思翰www.sihan.net思翰www.sihan.net
快速回复
限100 字节
 
上一个 下一个