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中接收到事件?
...全文
25 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
9.1事件机制与原理分析 9.1.1 什么是Qt事件驱动?         我们在写Qt工程类项目的时候都会发现,主程序里面都有这么一段代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 有点抽象,Qt进行了封装        实际上a.exec()便是Qt程序进入事件消息循环, 9.1.2 图形界面应用程序的消息处理模型 回调、os的魔抓windows、linux,从用户层到 内核层,如何管理进程、线程、 Os如何处理、底层机制 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的  系统内核的消息通过事件处理转变成QT的信号 9.1.3 Qt中的事件处理 (1)在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent.              事件处理的核心包括事件①产生、②分发、③接受和处理 ①事件的产生 谁来产生事件? 最容易想到的是我们的输入设备,比如键盘、鼠标产生的 keyPressEvent,keyReleaseEvent, mousePressEvent,mouseReleaseEvent事件 (被封装成QMouseEvent和QKeyEvent)。 ②Qt中事件的分发 谁来负责分发事件? 对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver.  对于Qt GUI程序,由QApplication来负责   ③事件的接受和处理 谁来接受和处理事件? 答案是QObject。 类是整个Qt对象模型的心脏,事件处理机制是QObject三大职责( 内存管理、内省intropection、事件处理制)之一。 任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。 9.1.4 QObject的内省机制

433

社区成员

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

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