QOpenGLWindow中第二根手指释放事件异常问题求助
Qt6 Android触摸事件异常:多手指释放后点数不更新
我正在开发一款Android游戏控制器(用于制作超级马里奥克隆版)来学习编程。现在碰到触摸事件处理的问题:按住第一根手指,触摸并释放第二根手指时,预期Qt Creator调试控制台输出:
TouchUpdate 2
TouchUpdate 1
我的触摸事件处理代码如下:
void OpenGLWindow::touchEvent(QTouchEvent *event) { switch (event->type()) { case QEvent::TouchBegin: { qDebug() << "TouchBegin"; event->accept(); break; } case QEvent::TouchUpdate: { qDebug() << "TouchUpdate " << event->points().length(); break; } } }
但仅前几次释放操作正常,后续操作出现延迟,多次操作后控制台持续显示:
TouchUpdate 2
TouchUpdate 2
问题原因及修复方案
- 核心问题:只处理了
TouchBegin和TouchUpdate事件,未处理TouchEnd和TouchCancel事件,导致Qt无法正确跟踪触摸点状态,多次操作后触摸点计数异常。 - 修复后的代码:
void OpenGLWindow::touchEvent(QTouchEvent *event) { switch (event->type()) { case QEvent::TouchBegin: qDebug() << "TouchBegin"; event->accept(); break; case QEvent::TouchUpdate: qDebug() << "TouchUpdate " << event->points().length(); break; case QEvent::TouchEnd: case QEvent::TouchCancel: // 处理这两个事件才能让Qt正确更新触摸点状态 qDebug() << "TouchEnd/Cancel " << event->points().length(); event->accept(); break; } }
- 关键说明:手指释放时系统会发送
TouchEnd事件,若触摸被系统中断则发送TouchCancel事件。不处理这两个事件的话,Qt内部触摸点管理器无法移除已结束的触摸点,就会出现计数始终为2的情况。同时要确保所有触摸事件都调用event->accept(),避免事件被父控件拦截导致状态混乱。
内容的提问来源于stack exchange,提问作者8Observer8
相关产品推荐
相关产品推荐

