共计 1099 个字符,预计需要花费 3 分钟才能阅读完成。
解决使用 win10 系统触摸屏触控正常,而在 win7 系统中却触摸不了的问题。
问题还原
- 下列代码中 win10 触摸板能正常工作,但在 win7 系统中却触摸不了。
/* main.cpp */ | |
QQuickWidget view; | |
view.setSource(QUrl("qrc:Main.qml")); | |
view.show(); | |
/* Main.qml */ | |
Item { | |
MouseArea { | |
anchors.fill: parent | |
onClicked: console.log(">>>>") | |
} | |
} |
问题分析
通过拦截 Qt 的事件队列,可以看到 win10 系统中的触摸事件如下:
QQuickMouseArea -> QEvent::TouchBegin | |
... | |
QQuickMouseArea -> QEvent::TouchEnd | |
... | |
QQuickWidget -> QEvent::MouseButtonPress | |
QQuickWindow -> QEvent::MouseButtonPress | |
QQuickMouseArea -> QEvent::MouseButtonPress |
win7 中的触摸事件:
QQuickMouseArea -> QEvent::TouchBegin | |
... | |
QQuickMouseArea -> QEvent::TouchEnd | |
... | |
QQuickWidget -> QEvent::MouseButtonPress | |
QQuickWindow -> QEvent::MouseButtonPress |
通过触摸事件信息对比 win10 与 win7 信息中它们都触发了触摸事件,由于 Qt 默认将触摸事件定向到鼠标事件,但 win7 最后却没有触发 QEvent::MouseButtonPress
导致显示触摸没反应的问题。
问题解决
- 为 QWidget 的派生类设置
Qt::WA_AcceptTouchEvents
属性,如:
view->setAttribute(Qt::WA_AcceptTouchEvents);
- 由于 QTouchEvent 和 QMouseEvent 事件独立。想要它们合成事件可以设置 QCoreApplication 的 setAttribute 的应用标记
Qt::AA_SynthesizeTouchForUnhandledMouseEvents
和Qt::AA_SynthesizeMouseForUnhandledTouchEvents
用于 启用 或禁用 触摸事件到鼠标事件或鼠标事件到触摸事件的自动合成。 - 其中,
Qt::AA_SynthesizeMouseForUnhandledTouchEvents
是不接受的所有触摸事件都将转换为鼠标左键事件。默认情况下启用此属性。
正文完