Qt状态机QState如何接收QKeyEvent?

weixin_38079736 2019-09-19 04:11:16
// ----------------------------GraphicsScene.h ---------------------------------//class PlayState;class GraphicsScene : public QGraphicsScene{     Q_OBJECTpublic:     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_OBJECTpublic:     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中接收到事件?
...全文
34 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

473

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧