问题描述
在重载QWidget控件的event()
函数处理触摸屏操作时,发现单指触摸事件会被默认转换成鼠标事件,导致程序接收了QEvent::TouchBegin
事件后无法继续接收后续的QEvent::TouchUpdate
、 QEvent::TouchEnd
事件。
查看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::TouchUpdate
与QEvent::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平台进行