Qt 问题记录 [单指触摸默认转换鼠标事件]

问题描述

在重载QWidget控件的event()函数处理触摸屏操作时,发现单指触摸事件会被默认转换成鼠标事件,导致程序接收了QEvent::TouchBegin事件后无法继续接收后续的QEvent::TouchUpdateQEvent::TouchEnd事件。
Qt文档截图
查看Qt文档后发现Qt的事件处理中有以上两种属性可以控制触摸屏与鼠标事件的默认关系转换。根据Qt::AA_SynthesizeMouseForUnhandledTouchEvents属性的描述,由于应用程序不接受的所有触摸事件会自动转换成鼠标事件,因此可以用以下办法去解决问题。

解决方法

代码:

bool MyWidget::event(QEvent *event)
{
    if(event->type() == QEvent::TouchBegin ||
       event->type() == QEvent::TouchUpdate ||
       event->type() == QEvent::TouchEnd)
    {
        QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
        dealCustomEvent(touchEvent); //处理自定义函数
        return true; //重要!返回true,表示识别触摸事件,确保后续可以继续接收其他触摸事件
    }
    return QWidget::event(event);
}

后续的测试发现,在一定的情况下,依然会触发鼠标左键的一些事件,例如出现QEvent::TouchUpdateQEvent::MouseMove交替响应的情况。暂时未找到比较优雅的解决办法。

注:

setAttribute( Qt::WA_AcceptTouchEvents,true); //设置控件接收触摸事件

进一步探究:

//测试后发现没有效果,触摸事件依然存在默认的转换
qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents,false);

//在event()鼠标事件中返回false后,鼠标事件被转换成了触摸事件
qApp->setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents,true);

stackoverflow上看到的解决方法:
Qt::AA_SynthesizeMouseForUnhandledTouchEvents on Windows

所有代码测试均在win10平台进行

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值