QT Widget应用串口接收数据无法控制蛇游戏方向问题
QT Widget蛇游戏串口遥控无法修改移动方向问题解决
问题根源
你在serialport.cpp的readyRead回调里新建了Playground临时实例,调用RemotePressEvent时修改的只是这个临时对象的m_rkDirection变量,完全和当前运行的游戏界面实例不沾边——这才是方向没变化的核心原因,和线程本身没关系,只是线程场景下暴露了实例管理的问题。
解决步骤
传递真实游戏实例指针
在SerialReader类里添加成员变量保存Playground的实例指针:class SerialReader : public QObject { Q_OBJECT private: Playground* m_playground = nullptr; // 其他成员... public: void setPlayground(Playground* pg) { m_playground = pg; } // 其他方法... };然后在游戏初始化时(比如主窗口创建
Playground实例后),把指针传给SerialReader:Playground* gamePlayground = new Playground(this); m_serialReader->setPlayground(gamePlayground);修改回调逻辑,操作真实实例
删掉回调里新建临时对象的代码,直接用传入的实例指针调用方法,同时注意线程安全(确保UI操作在UI线程执行):// 原错误代码 // Playground tempPlayground; // tempPlayground.RemotePressEvent(key); // 修改后 if (m_playground) { QMetaObject::invokeMethod(m_playground, "RemotePressEvent", Qt::QueuedConnection, Q_ARG(int, key)); }验证RemotePressEvent的正确性
检查Playground::RemotePressEvent函数,确保它修改的是类成员m_rkDirection,而非函数内部的局部变量:void Playground::RemotePressEvent(int key) { switch(key) { case UP_KEY: if(m_rkDirection != DOWN) m_rkDirection = UP; break; // 其他方向逻辑... } }
内容的提问来源于stack exchange,提问作者Sonalk
相关产品推荐
相关产品推荐

