You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:47:02